Текст книги "Создание игр для мобильных телефонов"
Автор книги: Майкл Моррисон
Жанр: Зарубежная компьютерная литература, Зарубежная литература
сообщить о неприемлемом содержимом
Текущая страница: 15 (всего у книги 35 страниц)
Первый фрагмент нового кода – это создание проигрывателей. Ниже приведены четыре проигрывателя, необходимые для воспроизведения звуков, они объявлены, как переменные класса HCanvas:
private Player musicPlayer;
private Player celebratePlayer;
private Player squishPlayer;
private Player gameoverPlayer;
Как видно их этого кода, переменные ничем не отличаются друг от друга, кроме как именами. Разницы между проигрывателями MIDI-музыки и волновых звуков нет, пока они не созданы. Далее приведен код, создающий проигрыватели, он находится в методе start() класса HCanvas:
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
is = getClass().getResourceAsStream("Celebrate.wav");
celebratePlayer = Manager.createPlayer(is, "audio/X-wav");
celebratePlayer.prefetch();
is = getClass().getResourceAsStream("Squish.wav");
squishPlayer = Manager.createPlayer(is, "audio/X-wav");
squishPlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
Этот код напоминает рассмотренные ранее примеры и не содержит ничего принципиально нового. Для создания проигрывателей используются файлы Music.mid, Celebrate.wav, Squish.wav и GameOver.wav, хранящиеся в JAR-файле мидлета. Обратите внимание, что для каждого проигрывателя вызывается метод prefetch() непосредственно после создания, поэтому все звуки немедленно загружаются в память и готовы для воспроизведения.
Метод start() класса HCanvas также начинает воспроизведение фоновой музыки сразу после создания проигрывателей. Вот так выглядит запуск воспроизведения:
try {
musicPlayer.setLoopCount(-1);
musicPlayer.start();
}
catch (MediaException me) {
}
В метод setCountLoop() передается значение -1, это говорит о том, что мелодия будет воспроизводиться бесконечно. Этот метод вызывается перед методом start(). После этого начинается воспроизведение мелодии до тех пор, пока не будет вызван метод stop() или закрыт проигрыватель.
Все проигрыватели закрываются в методе stop() класса HCanvas:
musicPlayer.close();
celebratePlayer.close();
squishPlayer.close();
gameoverPlayer.close();
Теперь все проигрыватели созданы и готовы к воспроизведению. А фоновая музыка уже проигрывается. Но вы еще не видели код, в котором переключается воспроизведение звуков. Этот код находится внутри метода update() класса HCanvas, его код приведен в листинге 9.1.
Листинг 9.1. Метод update() класса HCanvas управляет воспроизведением звуков в игре Henway 2
private void update() {
// проверить, была ли перезапущена игра
if (gameOver) {
int keyState = getKeyStates();
if ((keyState & FIRE_PRESSED) != 0) {
// начать новую игру
try {
musicPlayer.setMediaTime(0); //При запуске игры начинается воспроизведение музыки
musicPlayer.start();
}
catch (MediaException me) {
}
chickenSprite.setPosition(2, 77);
gameOver = false;
score = 0;
numLives = 3;
}
// игра закончена, не нужно ничего обновлять
return;
}
// обработка пользовательского ввода, перемещение цыпленка
if (++inputDelay > 2) {
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
chickenSprite.move(-6, 0);
chickenSprite.nextFrame();
}
else if ((keyState & RIGHT_PRESSED) != 0) {
chickenSprite.move(6, 0);
chickenSprite.nextFrame();
}
if ((keyState & UP_PRESSED) != 0) {
chickenSprite.move(0, -6);
chickenSprite.nextFrame();
}
else if ((keyState & DOWN_PRESSED) != 0) {
chickenSprite.move(0, 6);
chickenSprite.nextFrame();
}
checkBounds(chickenSprite, false);
// обнулить задержку ввода
inputDelay = 0;
}
// проверить, перешел ли цыпленок через дорогу
if (chickenSprite.getX() > 154) {
// воспроизвести звук, если цыпленок перешел через дорогу
try {
celebratePlayer.start(); //Когда цыпленок достигает противоположной стороны дороги, воспроизводится звук
}
catch (MediaException me) {
}
// восстановить исходное положение цыпленка и увеличить счет
chickenSprite.setPosition(2, 77);
score += 25;
}
// обновить спрайты автомобилей
for (int i = 0; i < 4; i++) {
// переместить спрайты автомобилей
carSprite[i].move(0, carYSpeed[i]);
checkBounds(carSprite[i], true);
// проверить столкновение цыпленка и автомобиля
if (chickenSprite.collidesWith(carSprite[i], true)) {
// воспроизвести звук, если цыпленок погиб
try {
squishPlayer.start(); //Звук смятия воспроизводится, если цыпленок попадает под колеса автомобиля
}
catch (MediaException me) {
}
// проверить, закончена ли игра
if (–numLives == 0) {
// остановить игру и воспроизвести звук конца игры
try {
musicPlayer.stop(); //По окончании игры музыка останавливается, воспроизводится звук окончания игры
gameoverPlayer.start();
}
catch (MediaException me) {
}
gameOver = true;
} else {
// поместить цыпленка в исходное положение
chickenSprite.setPosition(2, 77);
}
// не нужно продолжать обновление спрайтов автомобилей
break;
}
}
}
Первый фрагмент кода метода update(), которому следует уделить внимание, – это код, расположенный в начале метода, проверяющий перезапуск игры. Если игра запущена снова, вы знаете, что по какой-то причине она была завершена, поэтому фоновая музыка была остановлена. При перезапуске игры следует возобновить воспроизведение фоновой музыки, для чего вызывается метод start() проигрывателя.
Следующий фрагмент кода, имеющий отношение к воспроизведению музыки, – это код, проверяющий, перешел ли цыпленок через дорогу. Если да, то воспроизводится звук Celebration, для чего вызывается метод start() соответствующего проигрывателя. Аналогичный код встречается далее в методе update(), когда выполняется проверка, попал ли цыпленок под колеса автомобиля.
Последний фрагмент нового кода метода update() появляется в конце, здесь проверяется окончание игры. Если игра окончена, то музыка останавливается и воспроизводится звук GameOver.
Теперь тестировать игру Henway 2 – это сплошное удовольствие, поскольку в нее добавлены звуки и музыкальное сопровождение, которые помогают почувствовать игру. Независимо от того, где вы тестируете игру, – на настоящем мобильном телефоне или в эмуляторе J2ME, вы, несомненно, оцените, как звуки могут украсить игру. Посмотрите на рис. 9.3, на нем видно, что цыпленок попал под автомобиль, однако вы не можете спорить, что это выглядит намного эффектнее в сопровождении забавного звука.
Рис. 9.3. Мидлет Henway 2 использует звуки, это украшает игру и подчеркивает важные игровые события, например, гибель цыпленка или удачный переход через шоссе
Когда вы будете играть в Henway 2, убедитесь, что при воспроизведении звуков нет задержек. Как я упоминал ранее, использование звуков в мобильных играх ограничено объемами памяти и производительностью, поэтому очень важно найти компромисс между применением цифровых звуков и скоростью игры. Вы должны аккуратно тестировать все создаваемые игры на большом числе различных телефонов, это поможет грамотно использовать звуки.
РезюмеВ этой главе был продолжен рассказ о звуках. Вы узнали, что такое цифровые звуки, и как они применяются в мобильных играх. Вы познакомились с волновыми звуками, научились воспроизводить их из JAR-архива и сетевого ресурса. Также вы познакомились с MIDI– и MP3-музыкой, научились использовать ее в играх. Глава завершилась совершенствованием игры Henway, разработанной в главе 7, в которую мы добавили цифровые звуки и музыку.
ЭкскурсияА теперь вам понадобится какое-нибудь устройство, которое может записывать звук. Если у вас есть маленькое цифровое записывающее устройство (например, MP3-плеер), то вы находитесь в выигрышном положении, если нет, вы можете использовать обычный магнитофон. Сейчас нашей задачей является запись реальных звуков, которые можно будет использовать в играх. Итак, если у вас есть идея о том, какую игру вы хотите создать, то, вероятно, знаете, какие звуки вам нужны. Вы, вероятно, найдете запись звуков очень веселым занятием, при этом не возникает проблемы авторского права, поскольку все, что вы записали, принадлежит вам.
Для начала пройдитесь по дому или офису и попробуйте записать звуки, которые издают разные предметы. Вы, например, можете использовать звук боя часов для имитации выстрелов в игре. Если вы живете рядом с оживленной улицей, попробуйте записать звуки, создаваемые автомобилями, игра Henway – хороший пример того, где можно использовать эти звуки. Если вы думаете об игре, происходящей на лоне природы, то можете пойти в парк и записать звук воды, листьев и т. п. Даже хруст ветки можно использовать для создания интересных звуковых эффектов в играх. Процесс записи звуков реального мира ограничен лишь вашей фантазией.
Часть III
Виртуальные миры и искусственный интеллект в мобильном телефоне
Глава 10
Создание замощенных игровых слоев
Архив Аркад
Продолжение классической аркады Defender – игра Stargate – по праву занимает место в зале славы. Выпущенная в 1981 году компанией Williams игра Stargate – это горизонтальный космический шутер, похожий на Defender, но более интересный. Некоторые из противников в этой игре названы именами конкурентов Williams: Yllabian (Bally) и Irata (Atari). В сети вы можете найти flash-версию этой игры: http://www.shockwave.com/sw/content/defender2. Существует также аркадная версия этой игры.
Вы когда-нибудь играли в игру, в которой мир намного больше по сравнению с экраном? Когда виртуальный мир намного шире, чем мы можем отобразить на экране, необходимо использовать некоторые приемы, помогающие определять размеры мира и какую именно часть необходимо отображать. В современных 3D-играх такие приемы очень сложны, а в 2D-играх это сделать не так сложно. К счастью, в MIDP 2.0 API есть класс, который значительно упрощает работу с большими виртуальными мирами. Этот класс называется TiledLayer. Класс помогает создавать замощенные слои (tiled layers). Такие слои очень похожи на спрайты, но они состоят из множества изображений (ср. мозаика). В этой главе вы познакомитесь с замощенными слоями, вы узнаете, как они используются для создания виртуальных миров.
Прочитав эту главу, вы узнаете:
► почему замощенные слои столь важны для программирования игр;
► как использовать специальные программные средства создания карт, помогающие облегчить построение замощенных слоев;
► как с помощью слоев создавать карты, лабиринты и прочие интересные фоновые изображения;
► что разработка приключенческого симулятора – это не такая сложная задача.
Что такое замощенный слой?Ранее вы узнали, что слой (layer) – это графический компонент игры, а спрайт – это особый вид слоя, который для визуального представления использует изображение или их последовательность. Замощенный слой очень похож на спрайт тем, что он используется как визуальный компонент игры, но, в отличие от спрайта, он состоит из нескольких изображений, размещенных друг относительно друга определенным способом. Когда вы создаете замощенный слой, то указываете несколько изображений или слоев, которые будут составлять слой. После этого вы указываете, как следует разместить эти изображения. На рис. 10.1 показано, как из нескольких изображений создается слой.
Рис. 10.1. Изображения как элементы головоломки, если их правильно сложить, то получится изображение
Как показано на рисунке, из нескольких изображений можно составить слой. В этом примере из отдельных элементов создается гоночная трасса. Несложно убедиться, что немного больший набор отдельных элементов позволяет построить достаточно большие и интересные слои – виртуальные миры компьютерных игр.
Если внимательно посмотреть на рис. 10.1, можно заметить, что изображения имеют уникальные числовые идентификаторы (от 0 и выше). Эти идентификаторы называются числовыми индексами, они используются при создании карт как ссылки на отдельные элементы слоя. Рисунок демонстрирует, как индексы используются в двухмерном массиве, определяя вид замощенного слоя. Возможно, самая полезная информация, которую дает приведенный рисунок, – это иллюстрация того, что замощенные слои очень легко создавать даже из небольшого набора изображений. Это очень важно для создания мобильных игр, особенно в связи с сильно ограниченными ресурсами памяти и связи.
При создании слоев важно учитывать единственное требование – все изображения замощенного слоя должны быть одинакового размера. Такое требование обоснованно, учитывая, что слои могут быть перемешаны и соединены друг с другом различными способами. Несмотря на то что слои должны быть одинакового размера, для размеров одного слоя ограничений нет. Например, если вы используете изображения размером 32х32 пикселя, то высота и ширина результирующего слоя должны быть кратны 32. Например, если вы хотите создать прямоугольный слой, состоящий из 24 элементов по ширине и 16 по высоте, то в результате вы получите слой размером 768х512 пикселей. Очевидно, что такой слой не поместится на экран, поэтому ваша игра должна быть создана так, чтобы в любой момент на экране отображался нужный фрагмент.
В следующей главе вы узнаете, как использовать средства MIDP 2.0 API для управления слоями и создания «окна просмотра» (viewing window), которое позволяет отображать отдельный фрагмент замощенного слоя. Пока вы можете достичь того же эффекта, используя метод draw() фрагмента слоя. Такая методика подразумевает смещение слоя относительно экрана так, чтобы была видна только та его часть, которую необходимо отобразить. Рисунок 10.2 иллюстрирует, как можно нарисовать гоночную трассу, показанную на рис. 10.1, на экране телефона.
Рис. 10.2. Когда размер замощенного слоя больше размера экрана, то в любой момент времени отображается лишь определенная часть
Поскольку все мобильные игры ограничены размерами экрана, замощенные слои дают великолепную возможность создавать большие игровые пространства, чем могут поместиться на экране телефона. Многие игры для персональных компьютеров используют подобную методику, однако в случае мобильных игр такой подход становится еще более полезным ввиду ограниченных размеров экранов мобильных устройств.
Вы, вероятно, уже понимаете уникальные возможности, которые предоставляют для разработки замощенные слои. Карты миров, гоночные трассы, коварные лабиринты – это только малая часть того, что вы можете сделать, используя замощенные слои. Еще более интересно то, что класс Sprite поддерживает такие слои, и вы можете проверять столкновение объектов. Например, вы создаете лабиринт, в котором стены – это преграды для любого спрайта, находящегося в лабиринте. В последующих разделах вы познакомитесь с тем, как можно использовать слои, а пока я хочу рассказать вам, как создавать карты.
Создание карт для замощенных слоевЗамощенные слои состоят из отдельных элементов, расположенных так, что создается иллюзия цельного изображения. При этом не возникает необходимости в смешивании пикселей. Замощенные слои создаются программными средствами, а не в графическом редакторе, поэтому игры могут загружать различные карты, составленные из одного и того же набора. Это делает использование слоев чрезвычайно гибким при сравнительно низких затратах ресурсов мобильного устройства.
Один из интересных этапов при работе со слоями – это разработка карты, определение положений отдельных изображений. Даже при создании простейшей карты, требуется сначала проработать ее на листе бумаги, пронумеровать отдельные изображения, а затем приступать к программированию. Хочу отметить, что я потратил не один лист бумаги, чтобы создать карты для игр, с которыми вы будете работать в последующих главах книги. К сожалению, позже я нашел программное обеспечение, которое значительно упрощает разработку карт.
Я нашел два пакета для создания карт, каждый из них очень удобен и полезен:
► Mappy;
► Tile Studio.
Основная идея, которая лежит в основе этих программных продуктов, заключается в том, что вы создаете изображение из набора слоев определенного размера. Такое программное обеспечение намного эффективнее, чем карандаш и бумага – вы можете экспериментировать, создавать различные карты и моментально оценить результат. Учитывая, что большинство мобильных устройств отображают лишь небольшую часть изображения, очень удобно разрабатывать карты на большом экране монитора.
В копилку Игрока
К сожалению, программы Mappy и Tile Studio работают только в среде Windows. Код Tile Studio доступен в сети, поэтому вы сможете найти версии, адаптированные для других платформ.
При выборе программного обеспечения руководствуйтесь исключительно собственным вкусом, хотя, на мой взгляд, работать с Mappy проще. С другой стороны, Tile Studio имеет больше инструментов. В следующих двух разделах речь пойдет о создании карт с использованием Mappy и Tile Studio.
Редактор карт Mappy – это достаточно простое приложение, которое позволяет визуально создавать и редактировать замощенные слои. Научиться использовать Mappy очень просто, эта программа хороша тем, что вы можете вставлять сгенерированный код непосредственно в код Java. Вы поймете, о чем я говорю, дальше. А пока посмотрите на рис. 10.3, на котором показана карта, созданная в Mappy.
Рис. 10.3. Чтобы приступить к созданию карты в редакторе Mappy, определите размер карты и количество используемых цветов
В копилку Игрока
Вы можете бесплатно загрузить Mappy с web-сайта http://www.tilemap.co.uk/mappy.php.
Задав размер слоя в пикселях и размер карты (количеством слоев), вы можете приступить к импорту карты. После того как из меню File (Файл) выбран пункт Import (Импорт), в правой части экрана вы увидите набор слоев, а в левой части – пустую карту (рис. 10.4).
Рис. 10.4. Слои загружены и готовы к размещению на новой карте
Чтобы приступить к созданию карты, щелкните по нужному слою из палитры и выберите нужный слой. Вы быстро поймете, как легко и просто создавать карты с помощью специального программного обеспечения. Я долго и мучительно рисовал карты карандашом на листах бумаги, а потом я понял, насколько эта задача облегчается, если использовать специальный редактор. Но дело не только в этом. Такие программные средства, как Mappy, позволяют вам видеть результат работы целиком непосредственно на экране. Это очень важно, учитывая, что на экране мобильного телефона вы можете видеть только небольшой фрагмент игрового мира.
На рис. 10.5 показан фрагмент достаточно большой карты, созданной с помощью Mappy.
Рис. 10.5. В Mappy отображается верхний левый угол созданной карты
Конечно, вы можете перемещать карту в окне Mappy. На рис. 10.6 показан фрагмент карты, изображенной на рис. 10.5.
Рис. 10.6. Перемещаясь по карте в Mappy, вы можете работать над отдельными областями карты
В копилку Игрока
CSV-файлы – это текстовые файлы, которые содержат информацию, разделенную запятыми. Вы можете создавать такие файлы в Microsoft Excel или любом текстовом редакторе.
Когда вы сделали нужную карту, ее необходимо экспортировать и использовать в Java-коде. Хотя в Mappy есть несколько механизмов и форматов экспортирования кода карт, я обнаружил, что CSV-файлы лучше всего подходят для целей мобильного программирования. Чтобы экспортировать карту в CSV-файл, из меню File (Файл) выберите пункт Export (Экспорт), сделайте необходимые настройки в диалоговом окне (рис. 10.7).
Рис. 10.7. Чтобы создать данные карты, необходимо экспортировать карту из Mappy в CSV-файл
Помните, что CSV-файл – это просто текстовый файл, поэтому вы можете открыть его в любом текстовом редакторе. Ниже приведен текст такого файла, созданного Mappy для карты, представленной на рис. 10.5, 10.6.
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 21, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 22, 3,
3, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 3,
3, 18, 2, 2, 2, 5, 15, 15, 15, 15, 15, 15, 6, 2, 20, 3,
3, 18, 2, 2, 2, 7, 10, 1, 1, 1, 1, 1, 16, 2, 20, 3,
3, 18, 2, 2, 2, 2, 14, 1, 1, 1, 1, 1, 16, 2, 20, 3,
3, 18, 2, 2, 2, 2, 7, 10, 1, 1, 1, 1, 16, 2, 20, 3,
3, 18, 2, 2, 2, 2, 2, 14, 1, 1, 1, 1, 16, 2, 20, 3,
3, 18, 2, 2, 2, 2, 2, 14, 1, 9, 10, 1, 16, 2, 20, 3,
3, 18, 2, 2, 2, 2, 2, 14, 1, 11, 12, 1, 16, 2, 20, 3,
3, 18, 2, 5, 6, 2, 2, 7, 13, 13, 13, 13, 8, 2, 20, 3,
3, 18, 2, 7, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 3,
3, 18, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 3,
3, 23, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
Если вы сравните эти индексы с элементами карт, представленными на рисунках, вы увидите, как карта соответствует этим числам. В следующих главах на основе этих данных мы восстановим карту, когда будем создавать мидлет Wanderer.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.