Майкл Моррисон - Создание игр для мобильных телефонов
После того как хранилище записей удалено, метод writeHiScores() создает новое хранилище, для чего вторым параметром при вызове метода openRecordStore() передается true. Затем выполняется цикл по всем элементам массива hiScores, каждый из элементов записывается в хранилище. Когда все рекорды записаны, хранилище закрывается, для чего вызывается метод closeRecordStore().
Вы создали код, считывающий список рекордов в начале игры, и записывающий список в хранилище по окончании игры. Но я не упомянул о том, как обновляется список рекордов. При окончании игры метод update() вызывает метод updateHiScores(), обновляющий список рекордов:if (carsLeft– == 0) {
// остановить музыку
try {
musicPlayer.stop();
}
catch (MediaException me) {
}
// воспроизвести звук окончания игры
try {
gameoverPlayer.start();
}
catch (MediaException me) {
}
// спрятать спрайт автомобиля
playerSprite.setVisible(false);
// обновить список рекордов
updateHiScores(); //Вызов метода updateHiScores() – это все, что необходимо для обновления списка рекордов
gameOver = true;
return;
}Метод updateHiScores() – это вспомогательный метод, который проверяет, попадает ли результат игрока в список рекордов. Если да, то он добавляет этот результат, удаляя наименьший рекорд. В листинге 19.3 приведен код этого метода. Листинг 19.3. Метод updateHiScores() обновляет список рекордов
private void updateHiScores() {
// проверить, попадает ли результат игрока в список рекордов
int i;
for (i = 0; i < 5; i++)
if (score > hiScores[i]) //Если счет больше, чем текущий рекорд, то поместить результат игры в список рекордов
break;
// поместить результат в список рекордов.
if (i < 5) {
for (int j = 4; j > i; j–) { //Цикл смещает меньшие результаты в конец списка рекордов
hiScores[j] = hiScores[j – 1];
}
hiScores[i] = score;
}
}Метод updateHiScores() сначала проверяет, попадает ли результат, набранный игроком, в список рекордов. Если да, то он добавляется в список рекордов, при этом наименьший результат удаляется из списка. В списке рекордов содержится не более 5 записей, поэтому прежние рекорды уступают место новым. Помните, что список рекордов временно хранится в памяти телефона, пока игра существует, данные не будут помещены в хранилище, если не будет вызван метод stop().
Последнее необходимое изменение кода игры Space Out 2 касается метода draw(), который будет выводить список рекордов на игровой заставке. В листинге 19.4 приведен код метода draw().
Листинг 19.4. Метод draw() выводит заставку и список рекордов по окончании игрыprivate void draw(Graphics g) {
// вывести фоновое изображение звездного неба
g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
// вывести слои
layers.paint(g, 0, 0);
if (gameOver) {
// вывести изображение заставки и список рекордов
g.drawImage(splash, 90, 10, Graphics.TOP | Graphics.HCENTER);
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE));
for (int i = 0; i < 5; i++)
g.drawString(Integer.toString(hiScores[i]), 90, 90 + (i * 15),
Graphics.TOP | Graphics.HCENTER);
}
else {
// вывести оставшееся число автомобилей и счет
for (int i = 0; i < carsLeft; i++)
g.drawImage(smallCar, 2 + (i * 20), 2, Graphics.TOP | Graphics.LEFT);
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
g.drawString(Integer.toString(score), 175, 2, Graphics.TOP |
Graphics.RIGHT);
}
// вывести графику на экран
flushGraphics();
}Метод draw() игры Space Out 2 устроен несколько иначе, чем его предыдущая версия. Теперь он содержит условный оператор if, проверяющий окончание игры. Если игра окончена, то метод draw() выводит на экран заставку со списком рекордов. Если игра не окончена, то на экран выводятся оставшееся число автомобилей и счет в игре. Слои выводятся вне зависимости от статуса игры.
Тестирование игры
Аналогично предшественнику, игру Space Out 2 достаточно просто тестировать. На самом деле это даже весело, потому что вам придется поиграть несколько раз, чтобы сформировать список рекордов. На рис. 19.5 показана заставка игры, на которой выводится список рекордов. Если игра запущена впервые, то список рекордов пуст.
Рис. 19.5. При первом запуске игры на экране появляется заставка, список рекордов состоит из одних нулейПомните, что игра пытается считать список рекордов из хранилища записей, однако если хранилища не существует, то все элементы списка рекордов равны 0. Когда вы несколько раз поиграете в Space Out 2, в список рекордов будут занесены новые результаты. Если вы выйдете из игры, то список рекордов будет сохранен в хранилище записей. Когда игра запускается снова, рекорды считываются из хранилища. На рис. 19.6 показан список рекордов, загруженный из памяти.
Рис. 19.6. Список рекордов считывается из памяти телефонаСписок рекордов очень полезное дополнение игры Space Out 2, поскольку он отслеживает ваши лучшие результаты.
...В копилку Игрока
Пожалуйста, не судите строго о моих способностях как игрока по результатам, приведенным на рис. 19.6. Хотя вы можете превзойти мои результаты, тестируя игру, я не претендую на звание мастера игры Space Out. Немного практики, и все получится!
Резюме
Хотя списки рекордов не так популярны на сегодняшний день, как во времена широкого распространения аркад, вы не можете целиком сбрасывать их со счетов. По сей день хорошо отслеживать ваши игровые достижения и устанавливать новые горизонты. Списки рекордов – хороший способ запоминать наилучшие игры, а также могут послужить стимулом для других игроков. Конечно, списки рекордов не столь необходимы во всех мобильных играх, но вы должны добавлять их, если это целесообразно. Игра Space Out – хороший пример такой игры.
Эта глава завершает книгу, я надеюсь, она послужила вам началом дороги в мир разработки и программирования мобильных игр. Вы, вероятно, готовы к тому, чтобы использовать полученные знания для создания собственных игр и проектов. Я желаю вам успехов в работе над собственными играми. Вы можете зайти на мой сайт и поделиться идеями создания игр на форуме, который посвящен этой книге(http://www.michaelmorrison.com/).
В заключение
Подобно Джорджу Кастанца (George Cantanza) из классического эпизода «Сейнфелда» (Seinfeld), вы должны использовать свои знания в области игр и оставить свой след в списке рекордов. Выберите любую игру, наберите большое число очков и внесите себя в игровую историю. Вы сможете продемонстрировать свои достижения не только родственникам и друзьям. Возможно это подтолкнет создать список рекордов, куда можно было бы вводить имена и инициалы.
Приложения
Приложение А Java Game API
Java – это не просто язык программирования; это библиотека классов и интерфейсов, которая предлагает разработчикам широкий диапазон функций. Даже язык MIDP API, являющийся разделом Java, который был специально создан для программирования на мобильных телефонах, содержит весьма интересные функции. В MIDP API имеется пакет классов, предназначенных исключительно для мобильных игр. Данный пакет называется javax.microedition.lcdui.game. Он был добавлен в версии 2.0 MIDP API в ответ на многочисленные запросы разработчиков мобильных игр.
Классы в пакете javax.microedition.lcdui.game часто называют «API для мобильных игр»; эти классы очень важны, потому что они поддерживают функции, которые разработчикам MIDP 1.0 приходилось создавать самостоятельно. Другими словами, вам не придется изобретать велосипед, чтобы создавать новые игры в MIDP 2.0 API. Вероятно, самой важной функцией в API является встроенная поддержка графики с двойной буферизацией, которая максимально упрощает разработку игр с плавной графической анимацией. Кроме того, API поддерживает такие функции, как анимация спрайтов, вложенные слои, поиск ошибок и так далее.
API для мобильных игр в MIDP 2.0 включает пять классов:
► GameCanvas;
► Layer;
► LayerManager;
► Sprite;
► TiledLayer.
Остальные разделы данного приложения представляют собой краткий справочник по API для мобильных игр, который содержит описания классов MIDP 2.0, поддерживающих программирование для мобильных игр.
Класс GameCanvas
Класс GameCanvas происходит из стандартного класса Canvas; он предлагает специальную схему, которая поддерживает графику с двойной буферизацией. Вы можете воспринимать класс GameCanvas в качестве функции, обеспечивающей отображение интерфейса мобильных игр на экране телефона. Конечно, это может показаться вам странным, но класс GameCanvas отвечает за поддержку клавиатуры в играх. Для обработки команд с клавиатуры могут применяться и другие классы J2ME, однако поддержка клавиатуры в классе GameCanvas намного более эффективна, поэтому она лучше отвечает высоким требованиям, предъявляемым к мобильным играм.
Константы
В классе GameCanvas заданы следующие константы, которые используются для идентификации клавиш на мобильном телефоне:
► LEFT_PRESSED – клавиша ←;
► RIGHT_PRESSED – клавиша →;
► UP_PRESSED – клавиша ↑;
► DOWN_PRESSED – клавиша ↓;
► FIRE_PRESSED – клавиша Primary Fire;
► GAME_A_PRESSED – клавиша Game A (опционально);
► GAME_B_PRESSED – клавиша Game B (опционально);
► GAME_C_PRESSED – клавиша Game C (опционально);
► GAME_D_PRESSED – клавиша Game D (опционально).
Эти константы используются вместе с методикой getKeyStates(), которая описана в разделе «Методы» описания класса GameCanvas. Все константы клавиш являются масками бита, а это значит, что вы можете их использовать для того, чтобы определить, была нажата определенная клавиша или нет.