Главная » Программирование игр под Android » ПЛАН РАЗРАБОТКИ DROID INVADERS

0

 

После того как мы определили игровую механику, дизайн и ресурсы, мы можем начать программировать. Как обычно, создаем новый проект, копируем в него весь код нашего фреймворка, убеждаемся, что у нас есть подходящий манифест, значки и т. д. Весь код игры Droid Invaders будет помещен в пакет com. badl ogi с. androi dgames. droi di nvaders. Ресурсы будут храниться в директории assets проекта для ОС Android. Мы используем точно такую же структуру, которую применяли для игры Большой прыгун: стандартная активность будет наследовать от класса GLGame, несколько экземпляров класса GLScreen будут представлять собой различные экраны и переходы, как показано на рис. 12.4, классы для загрузки ресурсов и хранения настроек, а также классы для наших игровых объектов и класс, отрисовывающий наш игровой мир в 3D. Начнем с класса Assets.

КЛАСС ASSETS

Мы уже делали это раньше, поэтому не ожидайте ничего удивительного. Код класса показан в листинге 12.1.

Листинг 12.1. Класс Assets.java. загружаем и сохраняем активы, как и обычно

Здесь есть несколько членов, хранящих текстуры элементов пользовательского интерфейса и фонового изображения. Мы также храним несколько экземпляров класса TextureRegi oris и Font. Этого хватит для всех наших нужд, касающихся пользовательского интерфейса.

У нас также есть текстуры и экземпляры класса Vertices3, хранящие модели и текстуры игровых объектов. Кроме того, мы имеем экземпляр класса Animation, в котором хранятся кадры анимации взрыва.

Наконец, в классе есть несколько экземпляров классов Music и Sound, хранящих звуки игры.

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

Далее создаем экземпляр класса Texture для анимации взрыва, а также текстурные регионы для каждого кадра и экземпляр класса Animation. Мы просто проходим в цикле от верхнего левого угла до нижнего правого с шагом в 64 пиксела и создаем один экземпляр класса TextureRegion на каждый кадр. Все регионы далее передаются экземпляру класса Animation, каждый кадр которого длится 0,1 секунды.

Далее загружаем модели и текстуры для корабля, захватчиков, щитов и выстрелов. Это довольно легко сделать с помощью могучего класса Obj Loader, не правда ли? Обратите внимание, для текстур мы используем mip-текстурирование.

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

А это метод reload. Мы будем вызывать его в методе Droidlnvaders  onResume, поэтому текстуры будут перезагружаться, а воспроизведение музыки будет возобновлено.

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

ПРИМЕЧАНИЕ

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

КЛАСС SETTINGS

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

Листинг 12.2. Класс Settings.Java, наш старый знакомый

Мы храним информацию о том, включен ли звук, а также о способе управления кораблем. Настройки будут храниться в файле с расширением droidinvaders на карте памяти.

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

Сохранение опять же довольно скучное. Мы просто сохраняем все, а если происходит ошибка, то молча ее игнорируем. Это также неплохой участок для улучшения – возможно, вы захотите дать пользователю понять, что что-то пошло не так.

ОСНОВНАЯ АКТИВНОСТЬ

Как обычно, у нас есть основная активность, которая наследует от класса GLGame. Она отвечает за загрузку активов с помощью вызова метода Assets. 1oad при запуске, а также за приостановку и возобновление воспроизведения музыки в том случае, если приостановлена/возобновлена активность. В качестве стартового экрана мы просто возвращаем MainMenuScreen, который вскоре также реализуем. Единственное, о чем следует помнить, – это определение активности в файле манифеста. Убедитесь в том, что установлена пейзажная ориентация экрана. Код класса приведен в листинге 12.3.

Листинг 12.3. Класс Droidlnvaders.java. основная активность

Точно то же самое было в игре Большой прыгун. В вызове метода getStartScreen мы возвращаем новый экземпляр класса MainMenuScreen, который напишем далее. В методе onSurf aceCreatedC мы убеждаемся, что активы перезагружены, а в методе onPause мы приостанавливаем музыку, если она проигрывается.

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

ЭКРАН ГЛАВНОГО МЕНЮ

Мы уже написали множество простых экранов для предыдущих игр. В игре Droid Invaders также есть несколько подобных экранов. Принцип всегда одинаков: предоставляйте несколько элементов пользовательского интерфейса, на которых можно щелкнуть и запустить переход с одного экрана на другой, и отображайте важную информацию. На экране главного меню находятся логотип игры, а также кнопки Play (Играть) и Settings (Настройки) (что показано на рис. 12.4). При прикосновении к одной из этих кнопок срабатывает переход на экран GameScreen или Setti ngsScreen. Код этого класса приведен в листинге 12.4.

Листинг 12.4. Класс MainMenuScreen.java, экран главного меню

Как обычно, нам необходима камера для того, чтобы установить окно просмотра и виртуальное целевое разрешение, равное 480 х 320 пикселов. Мы используем экземпляр класса SpriteBatcher для отрисовки элементов пользовательского интерфейса и фонового изображения. Экземпляры классов Vector2 и Rectangl е помогут нам определить, было ли касание кнопки.

В конструкторе устанавливаем камеру и экземпляр класса SpriteBatcher, ничего необычного. Создаем также экземпляры классов Vector2 и Rectangles, используя заданные позиции и размеры двух элементов на экране, имеющем целевое разрешение 480 х 320.

В методе update получаем события прикосновения к экрану и проверяем их тип. Если появилось событие типа touch-up, преобразовываем его реальные координаты в координатную систему нашей камеры. Все, что нам остается сделать, – проверить, произошло ли прикосновение к одному из двух прямоугольников, ограничивающих пункты меню. Если один из них был задет, воспроизводим звук щелчка и переходим на соответствующий экран.

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

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

Остальная часть класса состоит из шаблонных методов, которые не делают ничего. Загрузка текстур происходит в активности Droidlnvaders, поэтому классу MainMenuScreen заботиться более не о чем.

ЭКРАН НАСТРОЕК

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

Выбор пользователя будет отражаться установкой соответствующих значений булевых переменных в классе Settings. Мы также убеждаемся, что эти настройки мгновенно сохраняются на карту памяти при каждом их изменении, с помощью вызова метода Setti ngs. saveO. Код класса приведен в листинге 12.5.

Листинг 12.5. Класс SettingsScreen.Java, экран настроек

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

В конструкторе просто устанавливаем значения всех членов класса. Ничего необычного.

Метод update получает события прикосновения к экрану и проверяет их тип. Если произошло событие touch-up, его координаты преобразовываются в координатную систему камеры. Затем проверяется вхождение этих координат в прямоугольники, ограничивающие кнопки, и определяется, какое именно действие следует предпринять.

Метод render выполняет те же самые действия, что и метод MainMenuScreen. render. Мы отрисовываем фоновое изображение и кнопки, применяя по необходимости текстурирование и смешивание. Основываясь на текущих настройках, определяем, какой текстурный регион будет использоваться для отрисовки трех кнопок настроек.

Остальная часть класса состоит из нескольких шаблонных методов, не имеющих никакой функциональности.

Перед тем как создавать класс GameScreen, нам следует сначала реализовать логику и отрисовку нашего мира. Шаблон MVC придет к нам на помощь.

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

По теме:

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