Adobe Flash 11 Stage3D (Molehill) game programming (Chapter 6 - 10) / Программирование игр в Adobe Flash 11 Stage3D (Molehill) (Глава 6 - 10): Таймеры, ввод и сущности: Великолепный геймплей!
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Теперь вы вступаете на уровень 7. Orion45 19.05.13 в 14:23 |
|
|
Интерактивность – отличительный признак игры. Геймплей - это результат обратной связи входных данных, которые приводят к интересным выходным данным. Действие и реакция. Нажмите кнопку и выстрелите пулей. Выстрелите ракетницей и разнесите пришельца в щепки. Уничтожьте босса и перейдите на следующий уровень. Всё это – цикл обратной связи, который превращает демо в игру. Причина и следствие, которые комбинируясь приводят к геймплею. Orion45 11.06.13 в 19:45 |
||
|
В этой главе мы добавим возможность перемещаться по нашему игровому миру. Без возможности управлять вещами, наша игра до сих пор больше была похожа на графическое демо. Кроме того, мы хотим иметь возможность управлять многими видами игровых лиц от погони камер за космическим кораблём до пуль и прочего. Orion45 11.06.13 в 20:05 |
||
|
Наш текущий квест. Orion45 15.06.13 в 16:07 |
||
|
Ваша скорость будет зависеть от частоты кадров, это значит, что она будет в зависимости от времени и не будет ускоряться или замедляться, если FPS изменится. Игровой мир будет увеличиваться и сложности с дополнительными астероидами и небом на заднем фоне. GUI игрового движка будет обновлено благодаря добавлению HUD (хэдз-ап-дисплей) графики, которая накладывается поверх 3D-графики. Наконец, ваш космический корабль будет иметь светящийся анимированный двигатель, чтобы быть немного более привлекательным. Orion45 15.06.13 в 17:18 |
||
|
Окончательный результат наших усилий будет выглядеть подобно этому: Orion45 15.06.13 в 17:29 |
||
|
Сохраняем простоту. Orion45 22.06.13 в 05:39 |
||
|
Вместо стремления совершать миллионы различных вещей, мы должны сначала сделать одну или две вещи хорошо и тогда шлифовать и углублять набор функций. Имея это ввиду, давайте запланируем первую реализацию простейших элементов геймплея и медленно улучшим их до «приносящих удовольствие». Orion45 22.06.13 в 05:53 |
||
|
Делаем это повторно используемым. Orion45 22.06.13 в 06:07 |
||
|
Например, в предыдущих главах, мы быстро взломали близкие значения, переключая шейдеры и текстуры, использующие клавиатурные события. Сейчас самое время улучшить этот код, добавить управление мышью и подготовить простой маленький класс входных игровых данных. Orion45 22.06.13 в 06:17 |
||
|
Для того, чтобы сделать это, мы должны создать повторно используемый игровой класс таймера, который отслеживает сколько времени прошло до сих пор, а также сколько точно времени прошло с момента предыдущего кадра. Это важно, потому что FPS будет постоянно изменяться ( без потерь пользователь играет на супер-мощном компьютере, и частота кадров никогда не падает ниже максимальной). Каждый кадр в игре будет занимать различный период времени и изредка будут большие расхождения между частотой кадров и периодом времени в ходе игровой сессии. Когда много всего происходит или есть сразу много мешей на экране, требуется длительное время, чтобы отобразить экран и обновить модели. Orion45 22.06.13 в 06:33 |
||
|
В совершенном мире наша игра никогда не должна опускаться ниже 60 fps, но в реальном мире будут случаи, когда частота кадров снижается (особенно на старых компьютерах) и мы не хотим, чтобы наша игра работала различно в зависимости от того, какой компьютер используется или сколько врагов видно. Orion45 22.06.13 в 06:39 |
||
|
Основанное на времени моделирование необходимо, чтобы обеспечивать отсутствие «икоты» во время игры, и чтобы все пользователи получили одинаковый опыт несмотря на аппаратные возможности их компьютеров. Эта информация «время, прошедшее за кадр» будет использоваться зачастую в типичных играх, чтобы управлять перемещениями вашего игрока, пулями и врагами, так, чтобы их скорость оставалась постоянной, несмотря на сложность сцены. Orion45 22.06.13 в 06:49 |
||
|
Наконец, вместо заполнения одного исходного файла Action Script с тысячами линий связанного кода, чтобы создавать и анимировать различные игровые объекты, такие как космические корабли, рельеф, будет мудро создать абстрактный класс игровых сущностей. Этот класс сущностей будет отвечать за инициализацию объектов , расчёт матриц трансформации каждого объекта, рендеринг себя, и т.д. Orion45 22.06.13 в 07:00 |
||
|
Вместо всего этого кода, размещённого в разных местах, и части которого разбросаны по основному базовому коду нашей игры, он должен быть собран в одно место и сделан повторно используемым. В этом случае один класс сможет управлять игроками, врагами, пулями, рельефом, спецэффектами и многим другим. Orion45 22.06.13 в 07:08 |
||
|
Делаем нашу игру более интерактивной. Orion45 22.06.13 в 07:16 |
||
|
Предыдущие шаги кратко намечают задачу, требуемую, чтобы обновить нашу игру до поддержки истинной интерактивности игрока, так же как и создание инфраструктуры, требующейся для будущих игровых прелестей, таких как враги, система частиц и другие спецэффекты. Начнём с самого простого из предыдущей задачи – создания модно выглядящего хэдз-ап-дисплея. Это может действительно добавить общий вид в вашу игру. Он заставит её чувствовать себя похожей на игру и будет большим вкладом. Orion45 22.06.13 в 07:32 |
||
|
Добавляем HUD-дисплей поверх графики. Orion45 25.06.13 в 18:17 |
||
|
Немного техно-метала и пара компьютерных экранов – это всё, что требуется, чтобы получить немного стиля в нашей игре. Вы можете использовать множество изображений или только одно изображение (как выше), которое точно такого же размера как и ваша игровая сцена. Импортируйте это изображение во Flash, перетащив его на палитру библиотеки и убедитесь, что оно использует корректное имя и доступно в вашем Action Script. Если вы используете чистый AS3 или Flex, тогда просто добавьте его в код тегом [Embed]. Orion45 25.06.13 в 18:35 |
||
|
Время для действий: накладываем GUI. Orion45 25.06.13 в 18:44 |
||
|
Мы только встроили AS3 код или версию для CS5 в зависимости от вашей рабочей среды. Сейчас, всё, что мы должны сделать – это добавить этот новый hudOverlay битмап на сцену во время инициализации вашей игры. Добавьте следующие строчки наверх вашей существующей функции initGUI() следующим образом: Orion45 25.06.13 в 18:51 |
||
|
Что же произойдёт? Orion45 25.06.13 в 19:00 |
||
|
Отслеживаем время: игровой класс таймера. Orion45 06.07.13 в 05:46 |
||
|
Один из очень удобных приёмов, который может быть использован, чтобы сохранить вашу игровую частоту кадров невероятно быстрой, это совершать сложные вычисления каждое время от времени, а не каждый отдельный кадр. Хотя многое в вашей игровой логике должно делаться каждый кадр как часть цикла рендеринга, большинство мастеров программирования игр полагаются на замечательную технику оптимизации, которую иногда называют функцией «сердцебиения». Это техника оптимизации, которую большинство ААА игр используют, чтобы сохранить FPS таким высоким, как это возможно. Orion45 06.07.13 в 06:04 |
||
|
Эта функция сердцебиения вызывается только время от времени. В нашем примере игры будем вызывать её только один раз в секунду. На данный момент мы не будем делать многого во время этой фазы, но это хорошая основа для медленных или сложных процедур, которые должны совершаться только иногда. К ним относится вычисление видимости объектов, когда вы имеете гигантский игровой мир: вместо прохода через каждый объект, возможно десятки тысяч каждый отдельный кадр, просто обновляйте видимость в зависимости от расстояния от камеры один раз в секунду. Orion45 06.07.13 в 06:18 |
||
|
В будущих доработках нашей игры мы сможем выбирать использовать её как идеальное место для LOD (уровня детализации), ИИ (искусственного интеллекта) и игровые события, такие как таймеры обратного отсчёта, которые могут быть использованы во времени бомб или показывать конец уровня, или срабатывание закрытия дверей или выключение света по истечении установленного интервала. Возможно, во время сердцебиения вы вызовете эффекты окружения, такие как вспышки молнии и звук грома, или запустите следующий кусок музыки. Процедуры подобно этим не должны запускаться каждый отдельный кадр. Orion45 06.07.13 в 06:34 |
||
|
На данный момент наша функция сердцебиения будет пустой оболочкой, готовой для будущего использования. Просто запомните, что всякий раз года страдает ваша частота кадров (должно быть слишком много вычислений происходит каждый отдельный кадр), вы можете рассмотреть возможность перемещения некоторого из этого кода в вашу функцию сердцебиения, так как она выполняется только время от времени. Если у вас есть код, который не должен запускаться каждый отдельный кадр, поместите его в функцию сердцебиения и запускайте её вместо этого только раз. Orion45 06.07.13 в 06:44 |
||
|
Примеры вещей, которые вы можете сделать в функции сердцебиения: Orion45 06.07.13 в 06:53 |
||
|
Для того, чтобы успешно реализовать предыдущие особенности, вы должны совершить следующее: Orion45 06.07.13 в 07:01 |
||
|
Время действовать - создаем класс таймер для игры oneassasin 03.07.13 в 15:31 |
||
|
Что же произойдёт? Orion45 06.07.13 в 07:10 |
||
|
Время для действий: добавляем конструктор класса GameTimer. Orion45 06.07.13 в 18:03 |
||
|
Что же произойдет? Orion45 06.07.13 в 18:20 |
||
|
Время для действий: реализуем функцию отсчёта. Orion45 06.07.13 в 18:32 |
||
|
Что же произойдет? Orion45 06.07.13 в 18:41 |
||
|
Функция getTimer возвращает значение в миллисекундах. Запомнив предыдущее значение, наш класс таймера может рассчитать, сколько мс прошло с начала игры или с последнего раза, когда вызывалась функция отсчёта. Orion45 06.07.13 в 19:32 |
||
|
Зачем измерять время постоянно? Разве не проще обновлять локации и анимации каждый кадр? Причина этого в том, что мы никогда не можем быть уверены, что наша частота кадров не будет колебаться. Человек, запустивший вашу игру на менее мощной машине, будет иметь более низкую частоту кадров, чем некто, запустивший игру на мощном игровом устройстве. Используя таймеры, ваша игра будет запускаться с одинаковой скоростью, несмотря на FPS, и по мере роста, она будет запускаться с точно такой же скоростью, независимо от того, насколько мощная машина. Orion45 08.07.13 в 01:49 |
||
|
В вашей игре вместо изменения положения движущейся ракеты с помощью жёстко закодированного расстояния каждый кадр, например, вы можете перемещать её на нужное расстояние путём умножения скорости на время его последнего обновления. Это называется независимая от частоты кадров симуляция. Orion45 08.07.13 в 01:57 |
||
|
Измерение времени – это первый шаг в создании интерактивности в игре. Анимации должны знать, сколько времени прошло, и игровые события часто происходят только в определённые интервалы. Некоторые объекты в нашей игре, возможно, должны знать свой «возраст», для того, чтобы взрываться после определённого периода времени. На данный момент это всё, что нам нужно, для того, чтобы перейти к следующему шагу. Orion45 08.07.13 в 02:05 |
||
|
Класс входящих игровых данных. Orion45 08.07.13 в 02:16 |
||
|
Так как многие игры могут вместо этого использовать мышь для перемещения или чтобы осмотреться, что должно быть удобно в шутерах от первого лица, мы должны также отслеживать местоположение мыши и обнаруживать нажатия кнопки и перетаскивания. Наконец, обычно многие игры используют клавиши клавиатуры W, A, S, D для перемещения, как альтернатива использованию клавиш со стрелками. Эта схема ввода данных очень распространена в шутерах и также является удобной , что обеспечит пользователям запуск вашей игры на устройствах без клавиш со стрелками (таких как некоторые телефоны), и они всё ещё смогут управлять вашей игрой. Orion45 08.07.13 в 02:31 |
||
|
Для того, чтобы запрограммировать предыдущие характеристики, мы должны совершить следующее: Orion45 08.07.13 в 02:37 |
||
|
Время для действий: создаём класс GameInput. Orion45 08.07.13 в 17:44 |
||
|
Что же произойдёт? Orion45 08.07.13 в 17:55 |
||
|
Время для действий: программируем конструктор класса Gamelnput. Orion45 08.07.13 в 18:04 |
||
|
Что же произойдет? Orion45 08.07.13 в 18:20 |
||
|
Время для действий: определяем движения мыши. Orion45 08.07.13 в 18:30 |
||
|
Следующая функция будет запускаться каждый раз, когда игрок перемещает мышь. В ситуациях, когда кнопка мыши удерживается нажатой, мы хотим отслеживать пройденное расстояние с момента, когда кнопка была нажата первый раз, для того чтобы надлежащим образом осуществлять «обзор мышью» в нашей игре. Orion45 11.07.13 в 00:19 |
||
|
Предыдущая функция срабатывает, когда впервые нажимается кнопка мыши. Текущее положение курсора мыши записывается для использования в предыдущей функции mouseMove, так что мы знаем, где «перетаскивание мышью» началось впервые, что позволяет нам измерять расстояние, которая она прошла по экрану. Orion45 11.07.13 в 00:26 |
||
|
Что же произойдёт? Orion45 11.07.13 в 00:33 |
