Главная » Программирование игр под Android » КЛАСС GAMESCREEN DROID INVADERS

0

 

Как только игра переходит к классу GameScreen, игрок может мгновенно начать играть, при этом не используется никакая проверка его готовности. Единственные состояния, о которых надо заботиться, следующие.

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

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

Законченная игра – в этом случае отрисовывается практически то же самое.

Мы опять используем прием, который уже применяли в игре Большой прыгун, где у нас были методы update и present  для каждого из трех состояний.

Единственная интересная часть этого класса – обработка пользовательского ввода.

Мы хотим, чтобы игрок мог управлять кораблем с помощью кнопок, расположенных на экране, а также с помощью акселерометра. Мы можем считать поле Setti ngs. touchEnabled, чтобы определить, как именно хочет это делать пользователь. В зависимости от выбранного метода ввода информации мы отрисовываем на экране кнопки, также, возможно, появляется необходимость передавать подходящие значения акселерометра методу Worl d. updateC.

Если отображаются кнопки, нам, конечно же, не нужно использовать показания акселерометра, вместо этого в метод World. update  будет передаваться постоянное искусственное значение ускорения. Оно должно находиться в промежутке от -10 (влево) до 10 (вправо). После недолгих экспериментов я остановился на значении -5 для движения влево и 5 для движения вправо с помощью экранных кнопок.

Последний интересный фрагмент класса – это способ объединения отрисовки трехмерного игрового мира и двухмерных элементов пользовательского интерфейса. Взглянем на код класса GameScreen, приведенный в листинге 12.11.

Листинг 12.11. Класс GameScreen.Java, экран игры

Как обычно, у нас есть несколько констант, кодирующих текущее состояние экрана.

Члены класса GameScreen также относятся к логике игры. У нас есть член, необходимый для отслеживания текущего состояния, камера, вектор для хранения точки прикосновения, экземпляр класса SpriteBatcher, необходимый для отрисовки двухмерных элементов пользовательского интерфейса, экземпляры классов World, Worl dLi stener и Worl dRenderer (которые мы очень скоро напишем), а также несколько экземпляров класса Rectangle, необходимых для проверки того, происходило ли прикосновение к элементам пользовательского интерфейса. В дополнение три переменных типа int отслеживают оставшееся количество жизней, волны захватчиков и счет, поэтому нам не нужно каждый раз обновлять параметр scoreString, а это позволяет снизить активность сборщика мусора. Наконец, есть параметр FPSCounter, необходимый для того, чтобы определять производительность игры.

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

Метод updateC передает управление обновлением одному из трех методов в зависимости от текущего состояния экрана.

Метод updatePausedO проходит в цикле по всем доступным событиям прикосновения к экрану и проверяет, было ли осуществлено нажатие одного из двух пунктов меню (Resume (Продолжить) или Quit (Выйти)). В каждом случае воспроизводим звук щелчка. Ничего нового.

Метод updateRunni ng отвечает за два действия: проверка нажатия кнопки паузы и соответственная реакция, а также обновление мира на основании действий пользователя. Первая часть этого пазла довольно тривиальна, поэтому рассмотрим механизм обновления мира. Как вы можете видеть, мы передаем расчет значения ускорения методу, который называется calculatelnput AccelerationO. Как только мир обновился, мы проверяем, изменились ли три состояния (жизни, волны и счет), и соответственно обновляем параметр scoreString. Наконец, проверяем, закончилась ли игра, если это так, то выполняется переход в состояние GameOver.

Метод calcul atelnput Accel eration – это то место, где на самом деле обрабатывается ввод данных пользователем. Если был включен режим управления кораблем с помощью прикосновений, мы проверяем, были ли нажаты кнопки перемещения влево или вправо и соответственно устанавливаем значение ускорения равным от -5 до 5. Если используется акселерометр, мы просто возвращаем его текущее значение по оси у (помните, игра работает только в пейзажном режиме).

Метод update GameOver также тривиален и просто проверяет, произошло ли прикосновение к экрану. Если да, то просто переходим на экран MainMenuScreen.

Метод presentO довольно прост. Как обычно, начинаем с очистки цветового буфера. Мы также очищаем z-буфер, поскольку собираемся отрисовать несколько 3D-объектов, для чего нам понадобится z-тестирование. Далее устанавливаем матрицу проекции, благодаря чему сможем отрисовывать двухмерное фоновое изображение так же, как и в классах MainMenuScreen или SettingsScreen. Как только все будет готово, мы прикажем классу Worl dRenderer отрисовать игровой мир. Наконец, передаем отрисовку элементов пользовательского интерфейса в зависимости от текущего состояния. Обратите внимание, что метод World Renderer. render отвечает за установку всего необходимого для отрисовки трехмерного мира.

Метод presentPaused просто отрисовывает строку scoreString с помощью экземпляра класса Font, хранящегося в классе Assets, а также меню паузы. Обратите внимание, что в этот момент мы уже отрисовали фоновое изображение, как и трехмерный игровой мир. Все элементы пользовательского интерфейса будут наложены на трехмерный мир.

Метод presentRunni ng  также довольно прямолинеен. Сначала мы отрисовываем строку scoreStri ng. Если был включен режим ввода данных с помощью прикосновений к экрану, то далее отрисовываем кнопки перемещения влево и вправо. В конце метода отрисовываем кнопку стрельбы и сбрасываем все состояния OpenGL ES, которые мы изменили (текстурирование и смешивание).

Метод present GameOverO – это просто отрисовка строк и элементов пользовательского интерфейса.

Наконец, рассмотрим метод pause, который просто переводит игровой экран GameScreen в приостановленное состояние.

Остальная часть класса представляет собой пустые методы. Она необходима для того, чтобы закончить описание интерфейса GLGame. Теперь перейдем к последнему классу – WorldRenderer.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии