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