Текст книги "Создание игр для мобильных телефонов"
![](/books_files/covers/thumbs_240/sozdanie-igr-dlya-mobilnyh-telefonov-45436.jpg)
Автор книги: Майкл Моррисон
Жанр: Зарубежная компьютерная литература, Зарубежная литература
сообщить о неприемлемом содержимом
Текущая страница: 14 (всего у книги 35 страниц) [доступный отрывок для чтения: 12 страниц]
Один из популярных звуковых форматов платформы Windows – это волновые звуки (wave sound). Такие звуки хранятся в файлах с расширением wav, их можно сохранять в любых форматах в зависимости от требуемого качества звучания. Вы можете сохранять звуки с частотой дискретизации от 8 до 44 кГц с 8 или 16 битами в одном сэмпле, качества стерео или моно.
Как и в случае любого другого цифрового аудио, размер Wav-файла прямо пропорционален качеству звука. Чем выше качество, тем больше памяти требует файл.
Для некоторых мобильных игр, чтобы минимизировать требуемые ресурсы и увеличить производительность, может потребоваться самое плохое качество звука. Выбор качества определяется самим звуком. Для большинства мобильных игр достаточно использовать звук со следующими характеристиками: 8 кГц, 8 бит, моно. Более того, такие звуковые файлы имеют минимальный размер. Не забывайте, что редкий телефон имеет динамики, которые можно сравнить с динамиками настольного компьютера. Поэтому не нужно сохранять качество звука.
Если вы используете компьютер, управляемый Windows, для экспериментов с Wav-файлами в этой операционной системе есть специальный инструмент. Он называется Sound Recorder (Звукозапись). Чтобы запустить его, выполните следующее:
1. щелкните по кнопке Start (Пуск);
2. выберите All Programs ==> Accessories ==> Entertainment (Программы ==> Стандартные ==> Развлечения);
3. выберите программу Sound Recorder (Звукозапись).
В копилку Игрока
Sound Recorder включен во все версии операционной системы Windows. Вы найдете его в папке Accessories (Стандартные). Если вы не используете Windows, то необходимо найти другое программное обеспечение.
Программа Sound Recorder показана на рис. 9.1
![](i_052.png)
Рис. 9.1. С помощью программы Sound Recorder вы можете записывать звуки и работать с ними
Вы заметите, что инструмент Sound Recorder содержит ряд кнопок, которые очень похожи на кнопки видеомагнитофона. Используя эти кнопки, вы можете записывать звуки с микрофона или CD-ROM, а также воспроизводить и останавливать их. Вы можете записать какой-нибудь звук, а затем добавить спецэффекты, например, обратное воспроизведение. Помните слухи о том, что если воспроизвести рок-музыку в обратном направлении, то можно услышать скрытые послания? Создайте собственное.
Создание и редактирование волновых звуковСовет Разработчику
Точное выделение звуков поможет не только минимизировать занимаемую ими память, но также сделает их воспроизведение более эффективным. Если вы запишете звук так, что в начале и конце не будет тишины, то он будет воспроизводиться быстро, в соответствии с выполняемыми действиями. В противном случае тишина будет вызывать заметную и раздражающую задержку в воспроизведении звука.
Когда вы приготовились к тому, чтобы создавать звуки, необходимо выбрать средство записи. Например, вы можете использовать для этих целей микрофон, записать стереозвук с кассетного проигрывателя или даже видеомагнитофона. Микрофон, пожалуй, – самое простое средство, поскольку практически все мультимедийные компьютеры оснащены им. Это также наиболее креативный способ. Однако вы можете использовать звуки, уже записанные на кассете, видеокассете, CD или DVD. В этом случае просто присоедините соответствующее средство к компьютеру.
Вне зависимости от места хранения требуемого звука процесс сохранения и обработки сэмплированного звука неизменен. После того как звук сэмплирован, воспроизведите его, убедитесь, что все в порядке. Может быть, звук будет слишком громким или, наоборот, тихим. Чтобы определить громкость звука, посмотрите на его временную диаграмму (waveform). Временная диаграмма – это графическое представление звуковой волны во времени. Если амплитуда сигнала слишком высока (выходит за пределы видимой области), то звук очень громкий. Если же вы с трудом слышите звук, то, вероятно, он слишком тихий. Чтобы устранить такие проблемы, вы можете либо подстроить входной уровень устройства и сэмплировать его снова, либо использовать инструменты усиления звукового редактора.
Самый лучший способ решения проблемы громкости звука – это подстройка входного уровня устройства и повторная дискретизация звука. После того как вы добились нужного уровня громкости, необходимо обрезать звук, удалив ненужные фрагменты. Обрезание звука (clipping) подразумевает выделение в звуковом редакторе области временной диаграммы и удаление ненужных фрагментов и тишины. Это помогает сократить длину звука и устранить ненужные задержки.
Совет Разработчику
Задержка (latency) – это интервал времени между началом воспроизведения звукового файла до начала звучания. Задержка должна быть сведена к минимуму, чтобы звуки воспроизводились в нужный момент. Лишние фрагменты тишины в начале звукового файла часто являются причиной задержки.
После того как создан звуковой эффект, он должен быть готов к своему звездному часу. Вы можете поэкспериментировать с различными звуковыми эффектами, которые можно создать с помощью звукового редактора. Это может быть обратное воспроизведение, эхо или фазовые сдвиги. Все ограничено лишь вашей фантазией!
Продолжение знакомства с интерфейсом PlayerВ предыдущей главе вы узнали, как использовать интерфейс Player для воспроизведения тоновых звуков. Несмотря на то что тоны поддерживаются широким спектром телефонных аппаратов, цифровые звуки и MIDI-музыка переводят аудио мобильных игр на новый уровень. К счастью, интерфейс Player также позволяет без труда воспроизводить эти типы звуков. Но перед тем как приступить непосредственно к изучению методов воспроизведения звуков, давайте снова взглянем на интерфейс Player, побольше узнаем о его работе.
В MIDP 2.0 Media API интерфейс Player выполняет функции пульта дистанционного управления для воспроизведения различных типов звуков. Обычно, воспроизведение звука с использованием интерфейса Player включает следующие шаги:
1. создание проигрывателя с помощью метода Manager.CreatePlayer();
2. вызов метода prefetch(), который инициализирует подкачку звука и минимизирует задержку;
3. вызов метода start(), который запускает воспроизведение;
4. вызов метода stop(), прекращающий воспроизведение при необходимости;
5. вызов метода close(), закрывающего проигрыватель.
Итак, перед вами достаточно ясная картина того, что необходимо выполнить, чтобы воспроизвести звук с помощью интерфейса Player. Однако многое осталось за кадром. Так, проигрыватель имеет пять стадий жизненного цикла: UNREALIZED, REALIZED, PREFETCHED, STARTED и CLOSED. Их важность заключается в том, что при воспроизведении звука проигрыватель постоянно переходит из одного состояния в другое. Точно так же, как вы проводите свою жизнь: спите, гуляете, обедаете, гуляете и так далее, – проигрыватель проходит через свои стадии.
Аккуратное определение состояний проигрывателя поможет обеспечить лучшее управление аудио. Например, если вы разрабатываете игру, в которой необходимо загружать большой файл звука посредством сетевого соединения, полезно будет знать состояние загрузки и готов ли звук к воспроизведению. Ниже приведено пошаговое описание переходов проигрывателя из одного состояния в другое:
1. первое состояние проигрывателя – UNREALIZED;
2. проигрыватель входит в состояние REALIZED, когда в его распоряжении есть все необходимое для получения медиаресурсов;
3. проигрыватель входит в состояние PREFETCHED, когда нужные файлы закачены и готовы к воспроизведению;
4. состояние STERTED наступает при воспроизведении ресурса проигрывателем;
5. проигрыватель возвращается в состояние PREFETCHED по окончании воспроизведения;
6. проигрыватель входит в состояние CLOSED при закрытии.
После того как проигрыватель инициализирован и запущен, большую часть времени он проводит в состояниях PREFETCHED и STARTED, в зависимости от того, воспроизводится ли звук. Чтобы получить текущее состояние проигрывателя, используется метод getState(), который возвращает одну из пяти констант состояния (UNREALIZED, REALIZED, PREFETCHED или CLOSED).
Теперь, когда вы имеете представление о различных состояниях проигрывателя, давайте посмотрим на некоторые важные методы интерфейса Player, рассмотрим их функции:
► realize() – реализует проигрыватель без получения медиаресурсов (обычно нет необходимости в отдельном вызове этого метода);
► prefetch() – получает медиаресурсы, помогает минимизировать задержу (вызывается при инициализации проигрывателя);
► getState() – этот метод возвращает состояние проигрывателя (вызывается в случае, если необходимо точно знать текущее состояние проигрывателя);
► setLoopCount() – метод устанавливает число повторов при воспроизведении звука (должен вызываться перед методом start());
► start() – начинает воспроизведение звука;
► stop() – останавливает воспроизведение;
► getDuration() – возвращает длину звука (в миллисекундах);
► getMediaTime() – возвращает текущее время воспроизводимого ресурса (в миллисекундах);
► setMediaTime() – устанавливает время текущего ресурса (в миллисекундах);
► close() – закрывает проигрыватель.
Сейчас нет необходимости запоминать названия методов и их функции. В последующих разделах вы познакомитесь с ними в контексте реальной программы, в которой будет показано, как воспроизводить звуки, MIDI– и MP3-музыку.
Воспроизведение Wav-звуков в мобильных играхБлагодаря MIDP 2.0 Media API в мобильных играх без труда можно воспроизводить цифровые звуки. Главное, что вы должны решить, – откуда берется звук. Например, он может храниться в JAR-файле или скачиваться через сеть. Очевидно, что удобнее всего получать файл из JAR-архива, поэтому в большинстве игр делается именно так. В следующих разделах речь пойдет о том, как воспроизводить звуки, воспользовавшись каждым из методов.
В копилку Игрока
Помимо того, что вы можете воспроизводить звуки, хранящиеся в JAR-файле или в сетевом ресурсе, также можно проигрывать звуки из хранилища записей. Хранилище записей – это специальные базы данных, которые использует мидлет для доступа к данным и их хранения. Поскольку проще всего для хранения звуков использовать JAR-файл, то такой подход применяется чаще всего.
Чтобы получить доступ к звуку, хранящемуся в JAR-файле мидлета, сначала необходимо убедиться, что нужный файл был добавлен в JAR-архив на этапе сборки мидлета. Если вы поместите звуковой файл в папке res внутри основной папки мидлета, он будет автоматически добавлен в JAR-файл при сборке мидлета инструментом KToolbar. Когда нужный файл находится в архиве, можно рассмотреть код, который необходим для его воспроизведения.
Чтобы воспроизвести звук из JAR-файла, необходимо создать поток звукового файла, а затем использовать его как основу для создания проигрывателя. Это может показаться не простой задачей, однако необходимо написать лишь пару строк кода. Ниже приведен фрагмент кода, который воспроизводит звук «окончания игры» из JAR-файла:
try {
Player gameoverPlayer;
InputStream is = getClass().getResourseAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/x-wav"); //MIME-тип auto/X очень важен – он означает волновой звук
gameoverPlayer.prefetch();
gameoverPlayer.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
Сначала создается объект InputStream, методу getResourseAsStream передается имя файла, который вызывается классом, возвращаемым методом getClass(). После того как входной поток создан, его необходимо передать в метод Manager.createPlayer(), а также указать MIME-тип звукового файла. В результате вы получаете новый объект проигрывателя, который почти готов к воспроизведению указанного звука. Чтобы убедиться, что звук воспроизводится с минимальной задержкой, вызывается метод prefetch(). Наконец, чтобы начать воспроизведение, вызывается метод start(). Поскольку некоторые из указанных методов могут вызывать исключения, их вызовы производятся в конструкции try-catch.
Помните, вы можете вызвать метод start() столько раз, сколько это необходимо. Однако если вызывать этот метод, когда звук воспроизводится, то он не начнет воспроизводиться заново. Для этого применяется метод setMediaTime(), в который в качестве параметра следует передать 0. Это будет означать, что вы хотите остановить воспроизведение и начать его с начала:
gameoverPlayer.setMediaTime(0);
Совет Разработчику
Метод setMediaPlayer() можно использовать для перезапуска воспроизведения любых звуков, проигрываемых с помощью интерфейса Player, включая MP3-звуки и MIDI-музыку.
Если говорить о длительности воспроизведения ресурса, то с помощью методов getDuration() и getMediaType() вы можете определить нужные параметры. Оба метода возвращают время в миллисекундах. Первый метод возвращает длительность звукового файла, а второй – время от начала воспроизведения.
Когда вы завершите работу со звуковым файлом, важно освободить занимаемые ресурсы, вызвав метод close():
gameoverPlayer.close();
Вот и все, что нужно для воспроизведения звуков, хранящихся в JAR-файле. Такой подход рекомендуется для большинства мобильных игр, поскольку звуки загружаются достаточно быстро и с минимальной задержкой.
В ряде случаев может возникнуть необходимость воспроизвести звук, хранящийся в сети. Например, в вашей игре могут воспроизводиться динамически создаваемые звуки, которые необходимо получать с сетевого сервера. Тогда вам все равно необходимо создать проигрыватель, но передать URL нужного файла. Вот как это можно сделать:
try {
Player gameoverPlayer = Manager.createPlayer
("http://yourserver/GameOver.wav");
gameoverPlayer.prefetch();
gameoverPlayer.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
Этот код проще, чем при использовании файла, хранящегося в JAR-архиве, нет необходимости создавать входящий поток. Но вместо этого, создавая проигрыватель, вы должны указать полный URL звукового файла. После того как проигрыватель создан, воспроизведение звука ничем не отличается от того, как если бы использовали звуковой файл из JAR-архива.
Почувствуйте музыку с MIDIВ копилку Игрока
Звук, загруженный из JAR-файла, становится доступным для воспроизведения намного быстрее, нежели при загрузке через сеть. Поэтому при попытке воспроизведения файла, хранящегося по указанному URL, может возникнуть значительная задержка. Конечно, это зависит от размера звукового файла и от скорости соединения.
Musical Instrument Digital Interface (цифровой интерфейс музыкальных инструментов) или MIDI появился в начале 80-х годов как попытка установить стандартный интерфейс между музыкальными инструментами. В то время основным применением MIDI была возможность использования специальной клавиатуры для управления синтезатором. Клавишные синтезаторы состоят из двух основных частей: клавиатуры и синтезатора. Клавиатура используется для обработки входной информации: какая нота была нажата и насколько сильно нажата клавиша. А синтезатор отвечает за выработку соответствующих звуков на основе полученной от клавиатуры информации. Поэтому исходной задачей MIDI была стандартизация контроля синтезатора с использованием клавиатуры. Со временем MIDI стал поддерживать большое число разнообразных музыкальных инструментов и устройств, но отношение клавиатура/синтезатор очень важно для MIDI при использовании на компьютере.
Так же, как и волновые звуки, MIDI-музыка – это цифровой сигнал. Однако в отличие от звуков, которые представляют собой аппроксимацию звуковой волны, MIDI-музыка состоит из нот. Иначе говоря, MIDI-песня состоит из набора тщательно подобранных музыкальных нот. Вы можете создать MIDI-песню точно так же, как записывают мелодию на нотном листе. Такая задача требует специального программного обеспечения, но она выполнима, если у вас есть музыкальное образование. Поскольку MIDI-музыка состоит из нот, а не из волн, результат ее воспроизведения зависит от устройства, используемого для проигрывания музыки. В случае мобильных телефонов MIDI-синтезатор имеет весьма ограниченные способности по сравнению с синтезаторами настольных компьютеров.
Я уже несколько раз упомянул термин MIDI-музыка, но не объяснил, как она хранится и как работать с ней. Подобно волновым звукам, MIDI-музыка хранится в файлах, которые имеют расширение. mid. В отличие от wav-файлов, файлы MIDI-музыки не так велики, поскольку ноты не занимают много места. Подобно wav-файлам, их можно воспроизводить с помощью проигрывателя, например, Windows Media Player (рис. 9.2). В отличие от волновых файлов, создание MIDI-музыки требует специальных музыкальных знаний и особого программного обеспечения.
![](i_053.png)
Рис. 9.2. Для воспроизведения MIDI-музыки можно использовать Windows Media Player
Чтобы тестировать MIDI-файлы, отобранные для звукового оформления игр, вы можете использовать проигрыватель компьютера. Если вы можете создать такой файл самостоятельно, то для оценки результата вашей работы вы можете протестировать его прежде, чем внедрять в игру.
Воспроизведение MIDI-музыки в мобильных играхБлагодаря интерфейсу Player из MIDP 2.0 Media API подобно wav-файлам MIDI-музыку очень легко воспроизводить. Процесс воспроизведения MIDI-музыки несколько отличается от процесса воспроизведения волновых файлов.
Чтобы воспроизвести MIDI-песню из JAR-файла, вы должны создать входящий поток, как и при воспроизведении из JAR-архива волнового файла. После того как вы создали входящий поток MIDI-файла, его необходимо использовать для создания проигрывателя, после чего воспроизводить. Ниже приведен код, который создает проигрыватель MIDI-файла из JAR-архива:
try {
Player musicPlayer;
InputStream is = getClass().getResourseStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi"); //Обратите внимание, что для воспроизведения MIDI-файла используется другой MIME-тип
musicPlayer.prefetch();
musicPlayer.start();
}
catch (IOException ioe)
}
catch (MediaException e) {
}
Единственная хитрость в этом коде – это MIME-спецификация воспроизводимого MIDI-файла при создании проигрывателя. Помимо этого, вызывается метод prefetch(), который минимизирует задержку, а метод start() запускает воспроизведение звука.
Совет Разработчику
MIDP 2.0 Media API также поддерживает воспроизведение MP3-музыки. Чтобы загрузить и воспроизвести MP3-песню, создайте входящий поток точно так же, как и в случае воспроизведения MIDI-песни или волнового файла, передайте имя и укажите MIME-тип файла, audio/mpeg.
Говоря о воспроизведении музыки, я упустил одну деталь. Я имею в виду повторы воспроизведения. По умолчанию звуковой файл воспроизводится один раз. Если требуется воспроизводить мелодию снова и снова, вы можете установить большое число повторов:
MusicPlayer.setLoopCount(-1);
Обычно в этот метод передается число повторов воспроизведения музыки, если вы передадите -1, то мелодия будет повторяться бесконечно, или до тех пор, пока не будет вызван метод stop().
Совет Разработчику
Если вы хотите контролировать число повторов мелодии, важно перед методом start() вызвать метод setLooptCount().
Ниже приведен код, который необходимо вызвать для закрытия проигрывателя MIDI-файла:
musicPlayer.close();
Вы, вероятно, уже понимаете всю гибкость интерфейса Player, который одинаково легко позволяет воспроизводить MIDI– и волновые файлы.
Как же воспроизвести файл через URL? Зная, как воспроизвести файл из JAR-архива, вы можете догадаться, что воспроизведение MIDI-файла через URL будет похоже на аналогичное воспроизведение wav-файла. И вы будете правы! Ниже приведен код, выполняющий это:
try {
Player gameoverPlayer =
Manager.createPlayer("http://yourserver/Music.mid");
gameoverPlayer.prefetch();
gameoverPlayer.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
В этом коде нет ничего удивительного, при создании проигрывателя вы просто определяете URL MIDI-файла. Помните, что вы можете зациклить воспроизведение файла в случае, если это необходимо.
Создание программы Henway 2В главе 7 вы разработали и создали свою первую настоящую мобильную игру Henway. Несмотря на то что Henway очень интересна с точки зрения как программирования, так и игры, в ней не хватает звука. Оставшиеся разделы этой главы посвящены доработке игры Henway, добавлению в нее цифровых звуков и музыки. Теперь вам придется вспомнить все, что вы узнали о цифровых звуках, и использовать эти знания на практике.
Первый шаг, который нужно сделать на пути добавления звука в игру, – это определить, какие именно моменты игры можно улучшить, используя звуковое сопровождение. Не нужно много думать, чтобы понять: цыпленок готовится перебежать через шоссе, цыпленок удачно перебирается на другую сторону дороги, и окончание игры. Но вы можете добавить, например, звуковое сопровождение шагов цыпленка, а также добавить звук клаксонов автомобилей. Но это тот случай, когда необходимо экспериментировать с настоящим мобильным телефоном, поскольку только так вы сможете определить грань необходимого числа звуков. Я не говорю о том, что звук – это плохо, но просто он замедляет выполнение мидлета.
Совет Разработчику
Если вы столкнулись с проблемой, что в конкретной ситуации необходимо использовать звук, но при этом вы теряете в производительности, вы всегда можете использовать тоны. Нет причины, по которой вы не должны смешивать тоны с цифровыми звуками. Такой подход позволяет создавать интересные звуковые эффекты без потери производительности.
Чтобы лучше понять эту проблему, вы должны осознать, что мобильные телефоны имеют очень ограниченные ресурсы памяти и производительности. Если воспроизводить лишь цифровые звуки, вы не сможете запустить вашу игру с максимальной частотой смены кадров. Следовательно, обычно следует избегать использования цифровых звуков, если скорость игры критична. Имея это в виду, вероятно, не следует озвучивать шаги цыпленка и клаксоны автомобилей.
В результате в игре Henway 2 будут следующие звуки:
► Celebration – цыпленок удачно перешел через дорогу;
► Squish – цыпленок попал под машину;
► Game Over – умер последний цыпленок, игра закончена;
► Music – фоновая музыка, воспроизводимая во время игры.
Первые три звука – это волновые звуки, последний – или MP3, или MIDI. Поскольку MIDI обычно занимают много меньше места и менее требовательны к ресурсам по сравнению с MP3, в игре Henway 2 я буду использовать MIDI-мелодию.
Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?