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);
}
Если вы вспомните, в игре High Seas пиратский корабль остается неподвижным в центре экрана, а остальные элементы перемещаются. Код обработки пользовательского ввода достигает этого эффекта, перемещая окно вида в соответствии с нажатыми клавишами. Сначала определяется, на какое расстояние необходимо переместить изображение, а затем окно перемещается вызовом метода setViewWindow(). Спрайт игрока перемещается на это расстояние, чтобы оставаться в центре экрана. Класс DriftSprite проверяет столкновение со слоем-барьером всех спрайтов, кроме спрайта пиратского корабля. Приведенный далее код выполняет проверку столкновения корабля игрока со слоем-барьером:
if (playerSprite.collidesWith(landLayer, true)) {
// восстановить исходные положения окна вида и спрайта игрока
layers.setViewWindow(xView, yView, getWidth(),
getHeight() – infoBar.getHeight());
playerSprite.move(-xMove, -yMove);
}
else {
// если столкновение не произошло, изменить координаты окна вида
xView += xMove;
yView += yMove;
}
Если столкновение произошло, то окно вида возвращается в исходное положение, которое было сохранено в переменных xView, yView. Спрайт игрока также возвращается в исходное положение таким образом, что он остается в центре игрового экрана. Если столкновения нет, то окно вида перемещается в новое положение, определяемое переменными xView и yView. Обновление спрайтов игры High Seas – это та часть кода, в которой выполняется большее число действий. Вот как это делается:
for (int i = 0; i < 2; i++) {
// обновить спрайты пиратов, бочек и мин
pirateSprite[i].update();
barrelSprite[i].update();
// проверить столкновение спрайта корабля и спрайта пирата
if (playerSprite.collidesWith(pirateSprite[i], true)) {
// воспроизвести звук спасения пирата
try {
rescuePlayer.start();
}
catch (MediaException me) {
}
// увеличить число спасенных пиратов
piratesSaved++; //Увеличить счетчик пиратов, потому что был спасен пират
// поместить пирата в новое положение
placeSprite(pirateSprite[i], landLayer); //Использовать спрайт пирата снова, поместив его в новое место
}
// проверить столкновение спрайта корабля со спрайтом бочки
if (playerSprite.collidesWith(barrelSprite[i], true)) {
// воспроизвести звук пополнения энергии
try {
Manager.playTone(ToneControl.C4 + 12, 250, 100);
}
Читать дальше
Конец ознакомительного отрывка
Купить книгу