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() и воспроизвести ее:
Читать дальше
Конец ознакомительного отрывка
Купить книгу