Теперь, когда вы имеете представление о различных состояниях проигрывателя, давайте посмотрим на некоторые важные методы интерфейса 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-файле мидлета, сначала необходимо убедиться, что нужный файл был добавлен в 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);