Чтение онлайн

ЖАНРЫ

Создание игр для мобильных телефонов
Шрифт:

Получив тоновый контроль, смело вызывайте метод setSequence, чтобы задать воспроизводимую последовательность. При этом понадобится передать созданный ранее массив типа byte:

toneControl.setSequence(marylambSequence);

И, наконец, чтобы воспроизвести последовательность, необходимо вызвать метод start:

tonePlayer.start;

Чтобы удостовериться, что при закрытии мидлета воспроизведение остановится, необходимо закрыть проигрыватель. Для этого необходимо вызвать метод close:

tonePlayer.close;

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

try {

Player tonePlayer = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);

tonePlayer.realize;

ToneControl.toneControl = (ToneControl)toneControl.getControl("ToneControl");

toneControl.setSequence(marylambSequence);

tonePlayer.start;

}

catch (IOException ioe) {

}

catch (MediaException me) {

}

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

Создание программы UFO 3

Если вы вспомните, то в программе UFO, которую мы создавали в предыдущих главах, вы управляете летающим объектом, чтобы он не столкнулся с астероидами.

В этой программе много потенциальных возможностей для применения тонов и звуковых последовательностей. Отдельные звуки целесообразно использовать для сопровождения движения НЛО и столкновения с астероидами, в то время как тоновую последовательность можно использовать для воспроизведения музыки. Итак, мы выделили три типа звуков, которые будем внедрять в программу UFO 3:

► звук, сообщающий о нажатии клавиши;

► звук, сообщающий о столкновении НЛО с астероидом;

► тоновая последовательность, используемая в качестве музыки.

В следующем разделе будет подробно рассмотрен код, выполняющий это.

Написание программного кода

Как вы узнали ранее, чтобы воспроизвести тон, нужен совсем небольшой код. Пример UFO 3 использует такой код для воспроизведения звука при нажатии на одну из клавиш со стрелками. Наиболее подходящий тон для сопровождения движения – это G4, нота G той же октавы, что и C4. Ниже приведен код, определяющий переменную G4, а затем воспроизводящий ее:

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

try {

Manager.playTone(G4, 100, 50);

}

catch (Exception e) {

}

Звук перемещения НЛО воспроизводится в течение 100 миллисекунд (1/10 секунды), громкость составляет 50 %. Тон, сообщающий о столкновении, воспроизводится аналогично:

try {

Manager.playTone(ToneControl.C4 – 12, 500, 100);

}

catch (Exception e) {

}

В случае взрыва воспроизводится звук C3, который расположен на одну октаву ниже, чем средний C (C4). Вместо того чтобы создавать переменную C3, достаточно верно указать смещение относительно ноты C4. Звук взрыва воспроизводится в течение 500 миллисекунд с громкостью 100 %. Это необходимо, потому что более низкий звук сложнее услышать.

Код, воспроизводящий отдельные тоны, находится в методе update класса UFOCanvas мидлета UFO 3. Этот класс также содержит код, который отвечает за воспроизведение тоновой последовательности в мидлете. В листинге 8.2 приведен код нового и улучшенного метода update.

Листинг 8.2. Метод update класса UFOCanvas, который воспроизводит тоны мидлета UFO 3

private void update {

// случайное воспроизведение звуков

if (rand.nextInt % 500 == 0)

playTune;

// обработка пользовательского ввода для управления НЛО

byte G4 = (byte)(ToneControl.C4 + 7); //Тон G4 определен относительно тона C(C4)

int keyState = getKeyStates;

if ((keyState & LEFT_PRESSED) != 0) {

// воспроизвести звук, означающий перемещение

try {

Manager.playTone(G4, 100, 50); //Воспроизведение тона G4 на громкости 50% в течение 1/10 секунды в ответ на нажатие клавиши

}

catch (Exception e) {

}

ufoXSpeed–;

}

else if ((keyState & RIGHT_PRESSED) != 0) {

// воспроизвести звук, означающий перемещение

try {

Manager.playTone(G4, 100, 50);

}

catch (Exception e) {

}

ufoXSpeed++;

}

if ((keyState & UP_PRESSED) != 0) {

// воспроизвести звук, означающий перемещение

try {

Manager.playTone(G4, 100, 50);

}

catch (Exception e) {

}

ufoYSpeed–;

}

else if ((keyState & DOWN_PRESSED) != 0) {

// воспроизвести звук, означающий перемещение

try {

Manager.playTone(G4, 100, 50);

}

catch (Exception e) {

}

ufoYSpeed++;

}

ufoXSpeed = Math.min(Math.max(ufoXSpeed, -8), 8);

ufoYSpeed = Math.min(Math.max(ufoYSpeed, -8), 8);

// переместить спрайт НЛО

ufoSprite.move(ufoXSpeed, ufoYSpeed);

checkBounds(ufoSprite);

// обновить спрайт астероида

for (int i = 0; i < 3; i++) {

// переместить спрайт астероида

roidSprite[i].move(i + 1, 1 – i);

checkBounds(roidSprite[i]);

// увеличить номер спрайта астероида

if (i == 1)

roidSprite[i].prevFrame;

else

roidSprite[i].nextFrame;

// проверить столкновение между НЛО и астероидом

if (ufoSprite.collidesWith(roidSprite[i], true)) {

// воспроизвести звук столкновения

try {

Manager.playTone(ToneControl.C4 – 12, 500, 100); //Воспроизвести низкий звук в течение половины секунды на полной громкости при столкновении

}

catch (Exception e) {

}

// восстановить начальное положение НЛО и его скорость

ufoSprite.setPosition((getWidth – ufoSprite.getWidth) / 2,

(getHeight – ufoSprite.getHeight) / 2);

ufoXSpeed = ufoYSpeed = 0;

for (int j = 0; j < 3; j++)

roidSprite[j].setPosition(0, 0);

// нет необходимости обновлять спрайты астероидов

break;

}

}

}

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

Метод initTune отвечает за инициализацию тоновой последовательности в мидлете UFO 3 (листинг 8.3).

Листинг 8.3. Метод initTune в классе UFOCanvas инициализирует тоновую последовательность

private void initTune {

byte tempo = 30; // 120bpm //Установить темп и длину нот

byte d4 = 16; // 1/4 ноты

byte d2 = 32; // 1/2 ноты

byte C4 = ToneControl.C4; //Определить последовательность нот на основании С4, а также тишину

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);

byte rest = ToneControl.SILENCE;

byte[] encountersSequence = {

ToneControl.VERSION, 1,

ToneControl.TEMPO, tempo,

ToneControl.BLOCK_START, 0,

A6,d4, B6,d4, G5,d4, G4,d4, D5,d2, rest,d2, //Мелодия из фильма «Близкие контакты»

ToneControl.BLOCK_END, 0,

ToneControl.PLAY_BLOCK, 0,

ToneControl.PLAY_BLOCK, 0,

};

try {

// создать тоновый проигрыватель

tonePlayer = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);

tonePlayer.realize;

// создать тоновый проигрыватель и установить тоновую последовательность

ToneControl toneControl = (ToneControl)tonePlayer.getControl("ToneControl");

toneControl.setSequence(encountersSequence);

}

catch (IOException ioe) {

}

catch (MediaException me) {

}

}

Этот метод начинается с объявления ряда важных переменных, которые будут использоваться для описания тоновой последовательности. Затем аккуратно задается байтовый массив тоновой последовательности. Целесообразно сказать, что эта последовательность – мелодия из фильма «Близкие контакты третьего рода» («Close Encounters of the Third Kind»), в котором инопланетяне для контакта с людьми использовали эту мелодию. Пять нот повторяются дважды в байтовом массиве encounterSequence. На рис. 8.3 показана тема из «контактов» в виде тоновой последовательности encounterSequence.

Рис. 8.3. Простая мелодия из кинофильма «Близкие контакты третьего рода» закодирована в виде тоновой последовательности

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

Метод playTune воспроизводит тоновую последовательность, а метод cleanupTune закрывает проигрыватель. В листинге 8.4 показаны эти два метода.

Листинг 8.4. Методы playTune и cleanupTune класса UFOCanvas соответственно воспроизводят и очищают тоновую последовательность

private void playTune {

try {

// воспроизвести тоновую последовательность

tonePlayer.start;

}

catch (MediaException me) {

}

}

private void cleanupTune {

// закрыть тоновый проигрыватель

tonePlayer.close;

}

Как вы видите, метод playTune воспроизводит тоновую последовательность, для чего вызывается метод start тонового проигрывателя. А вызов метода проигрывателя close – это все, что необходимо, чтобы закрыть проигрыватель и очистить тоновую последовательность.

Полный код мидлета UFO вы можете найти на прилагаемом CD. Я выборочно осветил важные фрагменты, поэтому вам не придется пролистывать страницы уже знакомого вам кода.

Тестирование приложения

Тестирование мидлета UFO 3 включает в себя тестирование динамиков и запуск мидлета в эмуляторе J2ME. Я бы хотел показать вам кадр из игры, где воспроизводится музыкальная тема и проигрывается тон во время столкновения, но, к сожалению, технология печати не достигла пока таких высот. Поэтому вам придется запустить мидлет и самим послушать тоны.

...

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

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

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

Резюме

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

Экскурсия

Если вы ни разу не видели фильм «Близкие контакты третьего рода», то обязательно возьмите его в прокате. Это великолепный фильм, он поможет понять многие аспекты игры UFO 3. Если вы уже видели фильм, я советую расширить созданную тоновую последовательность. Если вы вспомните, инопланетяне использовали ряд интересных звуковых последовательностей, кроме той, что мы уже использовали.

Глава 9 Воспроизведение цифрового звука и музыки

Поделиться с друзьями: