Не забудьте, что порядок, в котором вы добавляете спрайты в менеджер слоев, очень важен, первый добавленный спрайт будет выводится на экран поверх остальных объектов. Поэтому фоновые слои добавляются в последнюю очередь. Звуковые эффекты и музыка играют большое значение в оформлении большинства игр, и High Seas – не исключение. Приведенный ниже код устанавливает проигрыватели:
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
musicPlayer.setLoopCount(-1);
is = getClass().getResourceAsStream("Rescue.wav");
rescuePlayer = Manager.createPlayer(is, "audio/X-wav");
rescuePlayer.prefetch();
is = getClass().getResourceAsStream("Mine.wav");
minePlayer = Manager.createPlayer(is, "audio/X-wav");
minePlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}Как видно, для музыки создается один MIDI-проигрыватель, а также три проигрывателя – по одному на каждый из воспроизводимых в игре звуков (звук спасения пирата, звук подрыва на мине и звук окончания игры). Последний фрагмент метода start() начинает новую игру, для чего вызывается метод newGame():
newGame();
Чуть позже вы узнаете, как работает этот метод. А пока давайте перейдем к рассмотрению метода update(), который выполняет всю основную работу мидлета.
Разработка метода update()
Как вы знаете, метод update() вызывается один раз за игровой цикл, он отвечает за обновление спрайтов, слоев, проверяет столкновения, именно он обеспечивает работу приложения. В игре High Seas этот метод начинается с проверки окончания игры. Если результат положительный, начинается новая игра, для чего пользователь должен нажать клавишу «огонь»:
if (gameOver) {
int keyState = getKeyStates();
if ((keyState & FIRE_PRESSED) != 0)
// Start a new game
newGame();
// игра окончена, обновление не требуется
return;
}Для начала игры вызывается метод newGame(), о котором упоминалось ранее. Обратите внимание, что метод update() заканчивает свою работу сразу после вызова этого метода, потому что нет необходимости обновлять только что запущенную игру. Следующая функция метода update() – это обработка пользовательского ввода. Следующий код обрабатывает нажатие четырех клавиш со стрелками и перемещает окно вида:
int keyState = getKeyStates();
int xMove = 0, yMove = 0;
if ((keyState & LEFT_PRESSED) != 0) {
xMove = -4;
playerSprite.setFrame(3);
}
else if ((keyState & RIGHT_PRESSED) != 0) {
xMove = 4; //Чтобы корабль игрока передвигался быстрее, нужно изменить это значение
playerSprite.setFrame(1);
}
if ((keyState & UP_PRESSED) != 0) {
yMove = -4;
playerSprite.setFrame(0);
}
else if ((keyState & DOWN_PRESSED) != 0) {
yMove = 4;
playerSprite.setFrame(2);
}
if (xMove != 0 || yMove != 0) { //Изменить положение окна вида и переместить спрайт игрока в соответствии с нажатой клавишей
layers.setViewWindow(xView + xMove, yView + yMove, getWidth(),
getHeight() – infoBar.getHeight());
playerSprite.move(xMove, yMove);
}