layers.paint(g, 0, 0);
// вывод оставшегося числа автомобилей и счета
for (int i = 0; i < carsLeft; i++)
g.drawImage(smallCar, 2 + (i * 20), 2, Graphics.TOP | Graphics.LEFT); //Этот код выводит число оставшихся автомобилей
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM,
Font.STYLE_PLAIN, Font.SIZE_MEDIUM));
g.drawString(Integer.toString(score), 175, 2,
Graphics.TOP | Graphics.RIGHT);
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));
g.drawString("Final Score : " + score, 90, 70, Graphics.TOP |
Graphics.HCENTER);
}
// вывести графику на экран
flushGraphics();
}
Первая часть кода выводит фоновое изображение на экран – звездное небо в пустыне. Затем одной строкой кода выводятся слои, за которыми следуют вывод оставшихся автомобилей и счет в игре. Если игра окончена, то выводится соответствующее сообщение, состоящее из слов «GAME OVER» и числа набранных очков.
Начало новой игры
Несколько раз я уже упоминал о методе newGame() при обсуждении кода игры Space Out. В листинге 18.4 приведен код этого метода:
Листинг 18.4. Метод newGame() класса SOCanvas инициализирует игровые переменные и запускает музыку
private void newGame() {
// Initialize the game variables
gameOver = false;
score = 0;
carsLeft = 3;
// Initialize the player car sprite
playerSprite.setPosition(0, getHeight() – playerSprite.getHeight() – 10); //Поместить спрайт автомобиля в центре пустыни (по высоте)
playerSprite.setXSpeed(4);
playerSprite.setYSpeed(0);
playerSprite.setVisible(true);
// Initialize the alien and explosion sprites
for (int i = 0; i < 3; i++) { //При запуске игры пришельцы не видны
blobboSprite[i].setVisible(false);
jellySprite[i].setVisible(false);
timmySprite[i].setVisible(false);
explosionSprite[i].setVisible(false);
}
// Initialize the missile sprites
for (int i = 0; i < 10; i++) {
missileSprite[i].setVisible(false);
}
// Start the music (at the beginning)
try {
musicPlayer.setMediaTime(0);
musicPlayer.start();
}
catch (MediaException me) {
}
}
Метод newStart() начинается с инициализации трех основных переменных: gameOver, score и carsLeft. Спрайт игрока устанавливается в исходное положение и становится видимым – это необходимо сделать, поскольку спрайт скрывается по окончании игры. Все пришельцы, взрывы и ракеты в начале игры скрыты. Метод newGame() завершается запуском звукового проигрывателя, для чего вызываются методы setMediaTime() и start().
Добавление пришельцев, ракет и взрывов
Оставшаяся часть кода добавляет пришельцев, ракеты и взрывы. Этот код разделен на три метода, первый из которых – это addAlien(). В листинге 18.5 приведен код метода addAlien(), который отвечает за добавление пришельцев в игру.
Листинг 18.5. Метод addAlien() класса SOCanvas добавляет пришельца в игруprivate void addAlien() {
switch (Math.abs(rand.nextInt() % 3)) {