355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Майкл Моррисон » Создание игр для мобильных телефонов » Текст книги (страница 12)
Создание игр для мобильных телефонов
  • Текст добавлен: 15 октября 2016, 03:25

Текст книги "Создание игр для мобильных телефонов"


Автор книги: Майкл Моррисон



сообщить о нарушении

Текущая страница: 12 (всего у книги 35 страниц) [доступный отрывок для чтения: 13 страниц]

sprite.setPosition(-sprite.getWidth(), sprite.getY());

if (sprite.getY() < -sprite.getHeight())

sprite.setPosition(sprite.getX(), getHeight());

else if (sprite.getY() > getHeight())

sprite.setPosition(sprite.getX(), -sprite.getHeight());

}

else {

// остановить спрайт у края экрана

if (sprite.getX() < 0)

sprite.setPosition(0, sprite.getY());

else if (sprite.getX() > (getWidth() – sprite.getWidth()))

sprite.setPosition(getWidth() – sprite.getWidth(), sprite.getY());

if (sprite.getY() < 0)

sprite.setPosition(sprite.getX(), 0);

else if (sprite.getY() > (getHeight() – sprite.getHeight()))

sprite.setPosition(sprite.getX(), getHeight() – sprite.getHeight());

}

}

}

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

Класс HenwayMIDlet – это класс мидлета, который создает экземпляр класса HCanvas. По этой причине я опущу рассмотрение кода класса мидлета. Помните, что полный код мидлета Henway, а также прочих программ, рассматриваемых в книге, можно найти на прилагаемом компакт-диске.

Тестирование игры

Игру Henway намного веселее тестировать, чем программу UFO. Henway – это первая созданная вами полноценная игра, что делает этот мидлет очень привлекательным для пользователя.

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

На рис. 7.5 показано начало игры, ваш храбрый цыпленок готов к переходу через шоссе.

Рис. 7.5. Игра Henway начинается с того, что цыпленок готов к переходу через шоссе

Чтобы начать игру, просто проведите вашего цыпленка через дорогу, для чего используйте клавиши со стрелками на мобильном телефоне (или клавиши со стрелками на клавиатуре). Если вы успешно перевели цыпленка через шоссе, ваш счет увеличится на 25 очков.

Конечно, даже лучшие игроки Henway рано или поздно теряют цыпленка под колесами автомобиля. Когда такое случается, подается звуковой сигнал, а цыпленок возвращается на старт. Еще более важно, что игрок видит, что число жизней уменьшилось (рис. 7.6).

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


Совет Разработчику

Если вы обнаружите, что реакция на нажатия клавиш на клавиатуре очень замедлена, попробуйте уменьшить значение переменной inputDelay до 1. Это поможет увеличить скорость обработки ввода на треть.

Если вы потеряете всех трех цыплят, то игра заканчивается. На рис. 7.7 показан конец игры, на экране просто выводится ваш счет и строка «game over» (игра закончена).

Рис. 7.7. Если вы потеряли всех цыплят, то игра закончена

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

Резюме

Правда жизни такова, что теория бесполезна, если нет практики. Эта глава показала, что все изложенное ранее можно применить на практике – в вашей первой полноценной мобильной игре. В игре Henway используется методика обработки пользовательского ввода, о которой шла речь в предыдущей главе, а также все, что вы узнали о спрайтах. К счастью, теперь, когда есть MIDP 2.0, вы можете с легкостью создавать интересные мобильные игры при минимальных усилиях. Но мидлет Henway, не самый интересный, все только начинается!

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

В заключение

В игру Henway можно добавить одну интересную деталь – канализационные люки, которые часто можно увидеть на дорогах. Проходя по такому люку, цыпленок может провалиться в него. Необходимо проверять столкновение спрайта цыпленка со спрайтом люка. Ниже приведены шаги, которые необходимо выполнить, чтобы добавить люки смерти в игру:

1. создайте спрайтовое изображение люка – черный круг;

2. в методе start() создайте спрайт люка, убедитесь, что вы передаете созданное изображение. Убедитесь, что люки расположены именно на дорогах;

3. в метод draw() добавьте код для рисования новых спрайтов, убедитесь, что люки выводятся на экран сразу после создания фона, но прежде, чем выводятся спрайты автомобилей и цыпленка. Это очень важно, поскольку люки должны располагаться под автомобилями и цыпленком;

4. в метод update() добавьте код, проверяющий столкновение спрайта цыпленка со спрайтами люков. Если да, то остановите игру, будто цыпленка переехал автомобиль.

Эти изменения сделают игру Henway более интересной. Еще лучше, если на каждом уровне вы будете размещать люки случайным образом.

Глава 8
Добавляем звук

Архив Аркад

Выпущенная в 1981 году компанией Midway игра Gorf – это один из популярных космических шутеров (наряду с Space Invaders и Galaxian). Возможно, она популярна, поскольку унаследовала элементы обеих игр. Игра Gorf известна из-за синтезированной машинной речи, которая используется для диалога с игроком на различных этапах игры. Странное название – это не перевертыш слова «лягушка» (лягушка – frog, англ.), как некоторые могли бы подумать, а аббревиатура, образованная от Galactic Orbiting Robot Force (Галактические орбитальные машинные силы). Но мне больше нравится первый вариант!

В 1977 году в фильме «Звездные войны» прозвучала музыкальная тема, которая надолго осела в памяти тех, кто видел этот фильм. Эта нехитрая мелодия состояла из пяти нот. Если вы не понимаете, о чем идет речь, то потерпите, чуть позже я приведу ее в качестве примера создания мелодии. В этой главе вы познакомитесь с тоновыми звуками, а также узнаете, как в J2ME объединять звуки в единую мелодию. Тоновые звуки можно использовать для создания музыки и звуковых эффектов, т. к. они поддерживаются всеми телефонами стандарта MIDP 2.0.

В этой главе вы узнаете:

► о том, как, используя J2ME, добавить звуки в мобильные игры;

► основы теории тональных звуков и музыки;

► как запросить информацию об аудиовозможностях мобильного телефона;

► как воспроизводить звуки и их последовательности на мобильном телефоне.

Звук и мобильные игры

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

В J2ME есть поддержка мобильного аудио – Mobile Media API, который представляет набор классов и интерфейсов, поддерживающих разнообразные средства мультимедиа в зависимости от типа устройства. Интерфейс Mobile Media API состоит из двух различных наборов API:

Mobile Media API – для устройств с расширенными средствами мультимедиа и воспроизведения звука;

MIDP 2.0 Media API – для устройств, поддерживающих только аудио.

Неудивительно, что в настоящее время большинство мобильных телефонов поддерживают MIDP 2.0 Media API, поэтому мы уделим внимание этому интерфейсу. Чтобы вы лучше представляли, что можно сделать, используя MIDP 2.0 Media API, приведу список возможностей, поддерживаемых любым телефоном стандарта MIDP 2.0:

► основные функции управления: воспроизведение, остановка, пауза и т. п.;

► специальные средства, например, регулятор громкости;

► создание звуков и их последовательностей.

Вы уже знакомы со звуками и их последовательностями, иначе они называются рингтонами. Для игр вы можете использовать MIDP 2.0 Media API для создания звуков и их последовательностей – звуковых эффектов и музыки. Однако этим возможности API не исчерпываются. Он также поддерживает различные дополнительные типы мультимедиа, например, звуковые файлы, MIDI-музыку и MP3-аудио. Нет гарантии, что эти средства аудио поддерживаются всеми телефонами стандарта MIDP 2.0, но некоторые телефоны поддерживают эти возможности уже сегодня. Как у разработчика мобильных игр, у вас есть возможность использовать более совершенные средства работы со звуком, или использовать комбинированные приемы.

MIDP 2.0 Media API разработан с учетом трех основных компонентов: менеджер, проигрыватель и управление. Вместе эти три компонента создают программный интерфейс для работы с различными аудиосредствами. Классы и интерфейсы, входящие в состав MIDP 2.0 Media API размещены в пакетах javax.microedition.media и javax.microedition.media.control. Класс Manager, расположенный в пакете media, который позволяет опрашивать телефон о поддерживаемых средствах мультимедиа, а также создавать проигрыватели для воспроизведения любых типов мультимедийных данных. Интерфейс Player располагается в том же пакете, он реализует методы управления воспроизведением аудио. Интерфейс Control служит базовым интерфейсом для особых средств управления мультимедиа, например, регулятором громкости и звуков. Интерфейсы VolumeControl и ToneControl расположены в пакете media.control.

Общий подход, используемый для воспроизведения звука средствами MIDP 2.0 Media API, таков:

1. использовать класс Manager для доступа к особому типу данных;

2. использовать интерфейс Player для воспроизведения мультимедиа;

3. при необходимости использовать интерфейс Control для управления воспроизведением.

Указанный подход является общим и, естественно, может меняться в зависимости от типа медиа. Например, чтобы воспроизвести один звук, достаточно вызвать метод класса Manager, который называется playTone(). Чтобы создать и воспроизвести последовательность звуков, необходимо использовать интерфейс ToneControl. В этой главе вы научитесь воспроизводить рингтоны и отдельные звуки, в следующей речь пойдет о воспроизведении звуковых файлов, MIDI-музыки и MP3 аудио.

Тоновые звуки и музыка

Перед тем как приступить к изучению особенностей воспроизведения тонов в MIDP 2.0 Media API, важно узнать о некоторых аспектах тонов и музыки. Вспомните, что, с точки зрения физики, звук – это волна, перемещающаяся в пространстве. Звуковая волна – это результат сжатия и расширения среды. Иначе говоря, звуковая волна – это серия движущихся изменений давления. Вы слышите звук, потому что движущаяся звуковая волна попадает в ваше ухо, а изменение давления воздействует на барабанную перепонку. Если вы оказались на скалистом побережье океана, вы услышите, как волны разбиваются о скалы. Громкость звука определяется энергией звуковой волны.

Частота звуковой волны – это скорость, с которой колеблется (или вибрирует) волна при движении в среде. Колебания звуковой волны также называются высотой звука. Вы можете услышать звук различной частоты, если ударите ложкой по стеклянному стакану с водой. Количество воды в стакане влияет на частоту издаваемого звука, а следовательно, на высоту звука.

Частота звука измеряется в герцах (Гц) – число колебаний в секунду. Музыкальные ноты соответствуют звукам определенной частоты. Например, среднее C соответствует звуку с частотой около 262 Гц. Вместо того чтобы говорить о звуках в цифрах, в соответствие им ставят буквы A, B и C. В таблице 8.1 показана одна октава, которая содержит двенадцать нот и соответствующие им значения частот звука.

Таблица 8.1. Частоты звуков средней октавы

Вероятно, вы знаете, что ноты повторяются с увеличением или снижением тона, набор из 12 нот называется октавой. Ноты, которые отличаются на октаву, имеют частоты, отличающиеся в 2 раза. Аналогично, ноты, отстоящие на половину октавы друг от друга, отличаются частотами на половину октавы. Например, нота С, стоящая на октаву выше, чем средняя С, имеет частоту 524 Гц. В таблице 8.2 показано соотношение между нотами С различных октав.

В копилку Игрока

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

Таблица 8.2. Частоты звуков для ноты С в различных октавах

Имя каждой ноты в таблице 8.2 очень важно, поскольку оно позволяет непосредственно обратиться к ноте определенной октавы. Иначе говоря, вы можете задать нужную ноту простым именем, например, С5, A2, G4 и т. д. Такое принятое именование очень важно, поскольку оно будет использоваться в дальнейшем, когда речь пойдет о создании и воспроизведении рингтонов. Но перед этим давайте узнаем, как опросить телефон и получить данные о поддерживаемых аудиовозможностях, а также – воспроизвести звук.

Запрос аудиовозможностей аппарата

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

В копилку Игрока

Все телефоны стандарта MIDP 2.0 поддерживают звуки и их последовательности, поэтому вы всегда можете использовать их в играх.

Чтобы запросить возможности телефона, используется класс Manager. Если быть более точным, метод getSupportedContentTypes() возвращает список мультимедийных средств, которые поддерживаются данным телефоном. Поскольку этот метод статический, нет необходимости создавать экземпляр класса Manager, чтобы воспользоваться этим методом. Этот метод возвращает массив строк – список поддерживаемого контента. Ниже приведен пример того, как можно вызвать этот метод:

String[] contentType = Manager.getSupportedContentTypes(null);

Я же сказал, что это очень просто! После этого вызова массив contentType будет содержать список поддерживаемого контента в соответствии с их именами MIME. Ниже приведен список наиболее широко распространенных типов MIME, которые поддерживаются мобильными телефонами MIDP 2.0:

► audio/x-tone-seq – тоны и их последовательности;

► audio/x-wav – Wav-звуки;

► audio/x-midi – MIDI-музыка;

► audio/mpeg – MP3-аудио.

Несмотря на то что интересно поразмышлять о том, какие значения может возвратить метод getSupportContentTypes(), лучше опробовать его на реальном устройстве. В листинге 8.1 приведен код класса SSCanvas мидлета SoundCheck, который опрашивает телефон о его возможностях и выводит на экран каждый поддерживаемый тип контента.

Совет Разработчику

Класс Manager реализует другой метод – getSupportedProptocols(). Он опрашивает устройство о поддерживаемых протоколах передачи, с помощью которых можно получить доступ к определенному типу контента. Например, телефон может поддерживать загрузку Wav-файла из JAR-архива мидлета, однако не поддерживать загрузку через HTTP. Поскольку игры в этой книге разработаны так, что все необходимые ресурсы находятся в JAR-архиве, то выполнять проверку протоколов нет необходимости.

Листинг 8.1. Класс SSCanvas – это особый класс холста мидлета SoundCheck

import javax.microedition.lcdui.*;

import javax.microedition.media.*;

import javax.microedition.media.control.*;

public class SCCanvas extends Canvas {

private Display display;

public SCCanvas(Display d) {

super();

display = d;

}

void start() {

display.setCurrent(this);

repaint();

}

public void paint(Graphics g) {

// очистить холст

g.setColor(0, 0, 0); // черный

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(255, 255, 255); // белый

// получить данные о поддерживаемых типах контента

String[] contentTypes = Manager.getSupportedContentTypes(null); //Единственная строка кода выявляет все поддерживаемые типы контента

// вывести поддерживаемые типы звуков

int y = 0;

for (int i = 0; i < contentTypes.length; i++) {

// Draw the content type

g.drawString(contentTypes[i], 0, y, Graphics.TOP | Graphics.LEFT);

y += Font.getDefaultFont().getHeight();

// воспроизвести звук, если поддерживаются тоны

if (contentTypes[i] == "audio/x-tone-seq") {

try {

// воспроизвести среднее C (C4) в течение двух секунд (2000ms)

при максимальной громкости (100)

Manager.playTone(ToneControl.C4, 2000, 100); //Тон (среднее С) воспроизводится в течение 2 секунд на полной громкости в случае, если тоны поддерживаются устройством

}

catch(MediaException me) {

}

}

}

}

}

Метод paint() отвечает за вывод списка поддерживаемых типов контента. Как видите, метод Manager.getSupportContentTypes() заполняет строковый массив поддерживаемыми типами контента. Затем запускается цикл, в котором доступные типы по очереди выводятся на экран. Обратите внимание на два дополнительных пакета media, импортированных в код в первой строке.

Один интересный элемент приведенного кода – это проверка типа auto/x-tone-seq, которая завершается воспроизведением звука. Статический метод playTone() класса Manager, о котором вы подробнее узнаете в следующем разделе, используется для воспроизведения звуков. А пока вам достаточно знать, что второй параметр в этом методе – длительность воспроизведения звука в миллисекундах. Таким образом, в приведенном примере звук воспроизводится в течение двух секунд. А третий параметр в этой функции – громкость (в нашем примере 100 %).

Несмотря на то что код приложения весьма интересен, не менее интересно посмотреть на работу мидлета. На рис. 8.1 показан мидлет SoundCheck, запущенный в эмуляторе J2ME.

Рис. 8.1. Мидлет SoundCheck запрашивает типы поддерживаемого телефоном контента

Как видно из рисунка, мобильный телефон в эмуляторе J2ME поддерживает тоны, Wav-файлы, MIDI-музыку и MP3-аудио. Вы можете использовать эти результаты, чтобы включать поддержку определенных типов контента в мидлете.

Воспроизведение тонов в мобильных играх

Существует два принципиально разных метода воспроизведения тонов (звуков) в мобильных играх: использование тонов или последовательностей. Отдельный звук – это просто тон, имеющий определенную высоту и длительность воспроизведения. Хотя тоны, несомненно, ограничены событиями игры, они являются важной составляющей процесса разработки игр ввиду их простоты и эффективности. Чтобы воспроизвести звук, надо написать очень маленький код, затратив мало времени и ресурсов.

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

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

Воспроизведение отдельных звуков

Класс Manager в пакете javax.microedition.media используется для воспроизведения отдельных тонов. Этот класс содержит статический метод playTone(), который принимает следующие параметры:

нота – высота тона от 0 до 127;

длительность – длительность тона в миллисекундах;

громкость – громкость тона в процентах от максимального уровня громкости устройства.

Задать высоту звука из диапазона от 0 до 127 – не простая задача, но вы можете использовать математические формулы для вычисления нужной частоты звука. Не пугайтесь, я покажу вам наиболее простой способ определения значений нужных нот. Если вы вспомните, о чем шла речь в предыдущем разделе, в октаве – 12 нот (таблица 8.1). Расположив несколько октав по степени повышения звука, вы получите 128 нот. Отсюда и появился диапазон от 0 до 127 – каждой ноте соответствует один байт данных.

Так уж случилось, что средняя С имеет порядковый номер 60. В интерфейсе ToneControl пакета javax.microedition.media.control для средней С определена константа С4 (С в четвертой октаве). Поскольку вы знаете порядок нот (см. таблицу 8.1), вы без труда сможете вычислить значения нужных. Ниже приведен пример, как можно вычислить значения некоторых нот:

byte C4 = ToneControl.C4;

byte C5 = (byte)(C4 + 12);

byte A6 = (byte)(C4 + 21);

byte B6 = (byte)(C4 + 23);

byte G5 = (byte)(C4 + 19);

byte G4 = (byte)(C4 + 7);

byte D5 = (byte)(C4 + 14);

Первая переменная введена, чтобы упростить использование константы ToneControl.C4. Оставшиеся переменные – это ноты различных октав, которые рассчитаны относительно средней C4. Переменная C5 очень интересна, поскольку она на одну октаву выше, чем C4. Поскольку в октаве 12 нот, то, чтобы из C4 получить C5, можно к первой прибавить 12. Аналогично, чтобы из C5 получить C4, необходимо из C5 вычесть 12. Чтобы лучше понять операции с нотами, посмотрите таблицу 8.1.

Теперь, когда вы знаете, как определить высоту ноты, вам остается лишь передать ее в метод Manager.playTone() и воспроизвести ее:

try {

// воспроизвести среднее C (C4) в течение двух секунд (2000ms)

при максимальной громкости (100)

Manager.playTone(ToneControl.C4, 2000, 100);

}

catch(MediaException me) {

}

Этот код воспроизводит ноту C4 средней октавы, все очень просто, для этого даже не надо рассчитывать смещений. Обратите внимание, что эта функция принимает два дополнительных параметра, которые устанавливают длительность воспроизведения звука (2 секунды) и громкость (100 %). Вы, вероятно, обратили внимание, что метод playTone() вызывается внутри конструкции try-catch. Это необходимо, поскольку этот метод может вызвать исключение MediaException, если произойдет какой-нибудь сбой во время воспроизведения тона. В данном примере код ничего не выполняет, но вы можете, например, вывести соответствующее предупреждение или учесть это в коде.


    Ваша оценка произведения:

Популярные книги за неделю