При окончании игры сначала останавливается музыка, затем воспроизводится булькающий звук тонущего корабля. Затем спрайт игрока скрывается, для чего вызывается метод 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;
}В случае анимации водного слоя каждый из двух анимационных элементов изменяет свой вид. Обратите внимание, что анимация слоя выполняется в противоположных направлениях, для того чтобы элементы слоя не были одинаковыми. Это очень важно, поскольку они используют одинаковый набор изображений.
Вывод игрового экрана
Благодаря менеджеру слоев вывод игрового экрана весьма прост. В листинге 12.3 приведен код метода draw() класса HSCanvas.
Листинг 12.3. Метод draw() класса HSCanvas выводит информационную строку, игровые слои и строку «Game Over» при необходимостиprivate void draw(Graphics g) {
// вывести информационную строку, оставшуюся энергию и число спасенных пиратов
g.drawImage(infoBar, 0, 0, Graphics.TOP | Graphics.LEFT);
g.setColor(0, 0, 0); // черный
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
g.drawString("Energy:", 2, 1, Graphics.TOP | Graphics.LEFT);
g.drawString("Pirates saved: " + piratesSaved, 88, 1, Graphics.TOP |
Graphics.LEFT);
g.setColor(32, 32, 255); // синий //Справа от текста Energy вывести оставшуюся энергию как синий прямоугольник
g.fillRect(40, 3, energy, 12);
// вывести слои
layers.paint(g, 0, infoBar.getHeight());
if (gameOver) {
// вывести сообщение об окончании игры и набранные очки
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("GAME OVER", 90, 40, Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_MEDIUM)); //Вывести число спасенных пиратов
if (piratesSaved == 0)
g.drawString("You didn\'t save any pirates.", 90, 70,
Graphics.TOP | Graphics.HCENTER);
else if (piratesSaved == 1)
g.drawString("You saved only 1 pirate.", 90, 70,
Graphics.TOP | Graphics.HCENTER);
else
g.drawString("You saved " + piratesSaved + " pirates.", 90, 70,
Graphics.TOP | Graphics.HCENTER);
}
// вывести графику
flushGraphics();
}