Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Игровая среда

Создание игровой среды Android

После того как черновая работа выполнена, можно приступать к созданию непосредственно игры.

  • Игра разделяется на экраны, которые выполняют задачи: обрабатывают пользовательский ввод, соответственно с этим изменяют состояние экрана, прорисовывают игровые сцены. Для некоторых экранов поддержка пользовательского ввода не нужна, они переходят на другой экран после заданного промежутка времени (к примеру, экран заставки).

  • Экранами нужно управлять: отслеживать текущий экран и переходить с него на другой, что обозначает аннулирование первого экрана и установку второго как основного.

  • У экранов игры должен быть доступ к различным модулям для ввода, графики, звука и др., чтобы загружать ресурсы, прорисовывать фреймбуфер, следить за действиями пользователя и проч.

  • Так как игры проходят в режиме онлайн (что подразумевает непрерывное движение и обновление компонентов), нужно обеспечить максимально частое обновление состояния текущего экрана. Обычно это выполняется внутри основного цикла, который прерывается при выходе пользователя из игры. Одна итерация цикла – это кадр, количество кадров в секунду (fps) – частота обновления.

  • Нужно отслеживать промежуток времени, который прошел с момента появления последнего кадра, для кадронезависимого движения.

  • Также нужно наблюдать за состоянием окна (к примеру, состояние паузы) и информировать об этом текущий экран.

  • Игровая среда будет связана с настройкой окна и формированием компонента пользовательского интерфейса, который будет прорисован и от которого будет получен пользовательский ввод.

В первую очередь, мы создаем окна для игры и компонента пользовательского интерфейса, которые требуются для прорисовки и получения пользовательского ввода. Далее мы активируем все модули необходимые для низкоуровневой работы. Создаем стартовый экран, назначаем его текущим и фиксируем текущее время. Далее выполняется вход в главный цикл, который прерывается в тот момент, когда пользователь проявляет желание покинуть игру.

Внутри основного цикла рассчитываем дельта-интервал — это время, прошедшее с начала прошлого кадра. Далее фиксируем время начала текущего кадра. Текущее время и дельта-интервал, как правило, измеряются в секундах. В ситуации с экраном дельта-интервал показывает, сколько времени прошло после его последнего обновления. Эти данные нужны для кадронезависимого движения.

И напоследок, обновляем состояние текущего экрана и показываем его пользователю. Это обновление зависит от дельта-интервала и состояния; соответственно, мы передаем эти данные экрану. Представление включает визуализацию состояния экрана во фреймбуфере и воспроизведение любого аудиоресурса, запрашиваемого экраном (например, звука выстрела). Метод представления иногда тоже должен знать, сколько времени прошло после его последнего вызова.

Когда прерывается работа главного цикла, мы можем очистить и освободить все ресурсы, а затем закрыть окно.

Именно так ведет себя почти каждая игра на высоком уровне — обрабатывает ввод, обновляет состояние, демонстрирует его пользователю и повторяет весь цикл, пока пользователь не прервет игру.

Обычно приложения с пользовательским интерфейсом на современных ОС не работают в режиме реального времени. Они применяют событийную парадигму, при которой ОС уведомляет приложение о предстоящих событиях ввода и о необходимости визуализации. Это получают благодаря функциям обратного вызова, которые приложение фиксирует при старте в операции. Именно они отвечают за обработку приходящих оповещений о событиях. Все это выполняется в рамках главного потока приложения – т.н. пользовательского потока. В принципе идея возвращать ответы от функций обратного вызова максимально чаще хороша, поэтому не стоит осуществлять наш главный цикл в одной из них.

Вместо этого размещаем в отдельном потоке главный цикл игры, который создается при старте. Это значит, что нужно соблюдать некоторые меры предосторожности, получая события из пользовательского потока, например, события окна или ввод. Но этим лучше заняться при реализации игрового фреймворка.

Игровые и экранные интерфейсы

Интерфейс игры должен выполнять следующие функции:

  • создавать окно и компонент пользовательского интерфейса, функции обратного вызова для обработки событий пользователя и экрана;

  • запускать поток главного цикла программы;

  • отслеживать текущий экран, обновлять и представлять его в каждой итерации главного цикла, т.е. в кадре;

  • отслеживать любые события окна (например, пауза и возобновление игры) из потока пользовательского интерфейса и передавать их экрану для соответственного изменения состояния;

  • предоставлять доступ ко всем модулям, разработанным ранее: Input, Graphics, FileIO, Audio.