Создание игр для мобильных телефонов - Майкл Моррисон
Шрифт:
Интервал:
Закладка:
В копилку Игрока
Помимо того, что вы можете воспроизводить звуки, хранящиеся в 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
В ряде случаев может возникнуть необходимость воспроизвести звук, хранящийся в сети. Например, в вашей игре могут воспроизводиться динамически создаваемые звуки, которые необходимо получать с сетевого сервера. Тогда вам все равно необходимо создать проигрыватель, но передать URL нужного файла. Вот как это можно сделать:try {
Player gameoverPlayer = Manager.createPlayer
("http://yourserver/GameOver.wav");
gameoverPlayer.prefetch();
gameoverPlayer.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}Этот код проще, чем при использовании файла, хранящегося в JAR-архиве, нет необходимости создавать входящий поток. Но вместо этого, создавая проигрыватель, вы должны указать полный URL звукового файла. После того как проигрыватель создан, воспроизведение звука ничем не отличается от того, как если бы использовали звуковой файл из JAR-архива.
...В копилку Игрока
Звук, загруженный из JAR-файла, становится доступным для воспроизведения намного быстрее, нежели при загрузке через сеть. Поэтому при попытке воспроизведения файла, хранящегося по указанному URL, может возникнуть значительная задержка. Конечно, это зависит от размера звукового файла и от скорости соединения.
Почувствуйте музыку с MIDI
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-музыки требует специальных музыкальных знаний и особого программного обеспечения.
Рис. 9.2. Для воспроизведения MIDI-музыки можно использовать Windows Media Player
Чтобы тестировать MIDI-файлы, отобранные для звукового оформления игр, вы можете использовать проигрыватель компьютера. Если вы можете создать такой файл самостоятельно, то для оценки результата вашей работы вы можете протестировать его прежде, чем внедрять в игру.
Воспроизведение MIDI-музыки в мобильных играх
Благодаря интерфейсу Player из MIDP 2.0 Media API подобно wav-файлам MIDI-музыку очень легко воспроизводить. Процесс воспроизведения MIDI-музыки несколько отличается от процесса воспроизведения волновых файлов.
Воспроизведение MIDI-музыки из JAR-файла
Чтобы воспроизвести 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().