catch (MediaException me) {
}
// увеличить энергию игрока
energy = Math.min(energy + 5, 45); //Увеличить энергию игрока, потому что была подорвана бочка
// поместить бочку в новое положение
placeSprite(barrelSprite[i], landLayer); //Использовать спрайт бочки снова, поместив его в новое положение
}
}
После обновления обоих спрайтов этот код проверяет столкновение между спрайтом корабля и спрайтом пирата. Если столкновение определено, то воспроизводится звук спасения, означающий, что пират спасен. Число спасенных пиратов, определяемое переменной piratesSaved, увеличивается на 1. Спрайт пирата помещается в новое случайное положение, для чего вызывается метод placeSprite(). Для игрока пират исчез, а в реальности он просто переместился в другое место на карте. Это удобный способ убрать пирата и создать нового простым перемещением спрайта. Наконец, в этом фрагменте кода показано, как применять метод placeSprite(). После того, как было определено столкновение между спрайтами корабля и пирата, проверяется столкновение корабля с бочкой. В этом случае воспроизводится тоновый сигнал, а не wav-файл. Энергия игрока увеличивается, а бочка перемещается в новое место на карте.
...
Совет Разработчику
Максимальный объем энергии игрока в игре High Seas равен 45, поэтому код, изменяющий энергию игрока при столкновении с бочкой, восстанавливает уровень энергии до 45. Если бы не было этого ограничения, то индикатор энергии мог бы бесконечно расти, загородив индикатор спасенных пиратов.
Спрайты мины и осьминога обновляются в методе update() так же, как и спрайты бочки и пирата. Но этот код отделен от обновления бочек и пиратов, потому что число мин и осьминогов больше числа бочек и пиратов. Именно поэтому необходим другой цикл for:
for (int i = 0; i < 5; i++) {
// Update the mine and squid sprites
mineSprite[i].update();
squidSprite[i].update();
// проверить столкновение спрайта игрока и спрайта мины
if (playerSprite.collidesWith(mineSprite[i], true)) {
// воспроизвести звук подрыва на мине
try {
minePlayer.start();
}
catch (MediaException me) {
}
// уменьшить энергию игрока
energy -= 10; //Уменьшить энергию игрока, потому что он подорвался на мине
// поместить мину в новое случайное положение
placeSprite(mineSprite[i], landLayer); //Использовать спрайт мины снова, поместив его в новое положение
}
// проверить столкновение спрайта игрока и спрута
if (playerSprite.collidesWith(squidSprite[i], true)) {
// воспроизвести звук столкновения со спрутом
try {
Manager.playTone(ToneControl.C4, 250, 100);
}
catch (MediaException me) {
}
// уменьшить энергию игрока
energy -= 5; //Уменьшить энергию игрока, потому что он попал в щупальца спрута
}
}
Сначала выполняется обновление каждого спрайта, затем проверяется столкновение между игроком и миной, в этом случае воспроизводится звуковой эффект, и энергия игрока уменьшается. Мина также перемещается в новое место, аналогично тому, как это делается с пиратом и бочкой.
Столкновение со спрайтом осьминога выполняется почти так же. Вместо звукового файла воспроизводится тон, а энергия игрока также уменьшается. Однако спрайт осьминога не перемещается в новое положение. Это означает, что встреча корабля с осьминогом не заканчивается гибелью или исчезновением бедного морского животного. В этом случае игрок теряет энергию до тех пор, пока он находится в щупальцах монстра. Это делает осьминогов опаснее мин, несмотря на то, что потери энергии меньше.
Энергия корабля служит индикатором продолжения игры. Когда энергия становится меньше 0, игра заканчивается. Ниже приведен код, завершающий игру в случае гибели пиратского судна:
if (energy <= 0) {
// остановить музыку
try {
musicPlayer.stop();
}
catch (MediaException me) {
}
// воспроизвести звук тонущего корабля
try {
gameoverPlayer.start();
}
catch (MediaException me) {
}
// спрятать корабль игрока
playerSprite.setVisible(false); //Спрятать корабль игрока, потому что игра окончена
gameOver = true;
}
При окончании игры сначала останавливается музыка, затем воспроизводится булькающий звук тонущего корабля. Затем спрайт игрока скрывается, для чего вызывается метод setVisible(). Это означает, что корабль затонул. Наконец, переменной gameOver присваивается значение true, что говорит о том, что игра закончена. Последний фрагмент кода метода update() создает анимацию водного слоя:
if (++waterDelay > 3) {
if (++waterTile[0] > 3)
waterTile[0] = 1;
waterLayer.setAnimatedTile(-1, waterTile[0]);
if (–waterTile[1] < 1)
waterTile[1] = 3;
waterLayer.setAnimatedTile(-2, waterTile[1]);
waterDelay = 0;
}
В случае анимации водного слоя каждый из двух анимационных элементов изменяет свой вид. Обратите внимание, что анимация слоя выполняется в противоположных направлениях, для того чтобы элементы слоя не были одинаковыми. Это очень важно, поскольку они используют одинаковый набор изображений.
Читать дальше
Конец ознакомительного отрывка
Купить книгу