Главная » Программирование игр под Android » MRNOMGAME: ОСНОВНАЯ АКТИВНОСТЬ – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

Нашему приложению необходима точка входа, которая также именуется в Android активностью, задаваемой по умолчанию. Мы назовем эту активность MrNomGame и унаследуемся от Androi dGame, класса, который мы реализовали для того, чтобы написать игру. Этот класс необходим для создания и запуска нашего первого экрана. В листинге 6.1 показан класс MrNomGame.

Листинг 6.1. MrNomGame.Java, наш главный гибрид активности и игры package com.badlogiс.androidgames.mrnom;

Все, что необходимо сделать, – унаследовать от Androi dGame и реализовать метод getStartScreen , который вернет экземпляр класса Loadi ngScreen (мы реализуем его буквально через минуту). Это позволит нам приступить к самым важным вопросам, которые нужно решить для написания нашей игры: от настройки различных модулей звука, графики, ввода и файлового ввода/вывода до запуска потока основного цикла. Как видите, все достаточно просто, не так ли?

Ресурсы: удобное хранилище ресурсов

Загрузочный экран загрузит все объекты игры. Однако где же мы будем их хранить? Чтобы нам было удобно с ними обращаться, сделаем кое-что, не совсем типичное для Java: создадим класс, имеющий множество статических общедоступных членов.

В них будут содержаться все Pi xmap и Sound, которые мы загрузили из ресурсов (весь класс показан в листинге 6.2).

Листинг 6.2. Assets.java, здесь для быстрого доступа содержатся все ресурсы Pixmap и Sound

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

или так:

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

Настройки: сохранение пользовательских настроек и таблицы рекордов

Есть еще две вещи, которые нам необходимо отобразить на экране загрузки: пользовательские настройки и таблицу рекордов. Если вы снова посмотрите на экраны главного меню и таблицы рекордов увидите, что пользователь может регулировать звук, а также то, что мы сохраняем пять лучших рекордов. Мы сохраним данные настройки на карту памяти для того, чтобы их можно было заново загрузить, когда игра будет запущена в следующий раз. Для этого реализуем еще один простой класс – Settings (листинг 6.3).

Листинг 6.3. Settings.Java: хранит, загружает и сохраняет наши настройки package com.bad.ogic.androidgames.mrnom;

Проигрываются ли звуковые эффекты, зависит от общедоступного статического булева значения soundEnabled. Таблица рекордов хранится в целочисленном массиве из пяти элементов, отсортированных в порядке убывания. Мы задаем по умолчанию для обеих настроек только такие данные, которые целесообразно так задавать. Можно получить доступ к этим двум членам так же, как к членам класса Assets.

Статический метод loadО пытается загрузить настройки из файла .mrnom из внешнего хранилища. Для этого ему необходим экземпляр класса Fi1е, который мы передаем методу. Он предполагает, что настройки звука и каждая запись рекорда хранятся в отдельной строке, и просто читает их. Если что-то идет не так (например, хранилище недоступно или файл настроек еще не готов), мы просто оставляем значения по умолчанию и игнорируем ошибку.

Следующий метод называется save О. Он берет текущие настройки и сериализует их в файл . mrnom на карте памяти (например, /sdcard/. mrnom). Настройки звука и каждая запись рекордов хранятся как отдельная строка в этом файле, как это и предполагается методом 1oad. Если что-то пойдет не так, мы просто игнорируем ошибку и используем данные по умолчанию, указанные ранее. Возможно, вы захотите проинформировать пользователя об ошибке загрузки.

Последний метод, addScoreO, – вспомогательный. Мы будем использовать его для того, чтобы добавить новый рекорд в таблицу рекордов, автоматически сортируя их.

LoadingScreen: получение ресурсов с накопителя

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

Листинг 6.4. LoadingScreen.Java, который загружает все объекты и настройки package com.badlogiс.androidgames.mrnom;

Мы наследуем класс Loadi ngScreen от класса Screen. Для этого необходимо реализовать конструктор, принимающий параметр с типом Game, который мы передаем конструктору родительского класса. Обратите внимание, что этот конструктор будет вызываться в MrNomGame.getStartScreen, который мы описали ранее.

Далее следует реализация метода updateO, который загружает объекты и настройки. Для объектов-изображений мы просто создаем новые Pixmap с помощью метода Graphics.newPixmapO. Обратите внимание, что мы уточняем, какой формат цвета должен иметь Pi xmap. Фон имеет формат RGB565, а все остальные изображения – ARGB4444. Мы это делаем для ускорения визуализации. Наши исходные изображения хранятся в форматах PNG RGB888 и ARGB8888. Мы также загружаем три звуковых эффекта и сохраняем их в соответствующих членах класса Assets. Далее загружаем настройки из внешнего хранилища с помощью метода Setti ngs. load. Наконец, запускаем переход экрана к объекту Screen под названием MainMenuScreen, который с этого момента примет на себя выполнение команд.

Остальные методы – просто заглушки, они ничего не делают. Поскольку метод update немедленно запустит переход экрана после того, как все объекты загружены, на этом экране нам больше ничего делать не надо.

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

По теме:

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