Вы создали код, считывающий список рекордов в начале игры, и записывающий список в хранилище по окончании игры. Но я не упомянул о том, как обновляется список рекордов. При окончании игры метод update() вызывает метод updateHiScores(), обновляющий список рекордов:
if (carsLeft– == 0) {
// остановить музыку
try {
musicPlayer.stop();
}
catch (MediaException me) {
}
// воспроизвести звук окончания игры
try {
gameoverPlayer.start();
}
catch (MediaException me) {
}
// спрятать спрайт автомобиля
playerSprite.setVisible(false);
// обновить список рекордов
updateHiScores(); //Вызов метода updateHiScores() – это все, что необходимо для обновления списка рекордов
gameOver = true;
return;
}Метод updateHiScores() – это вспомогательный метод, который проверяет, попадает ли результат игрока в список рекордов. Если да, то он добавляет этот результат, удаляя наименьший рекорд. В листинге 19.3 приведен код этого метода. Листинг 19.3. Метод updateHiScores() обновляет список рекордов
private void updateHiScores() {
// проверить, попадает ли результат игрока в список рекордов
int i;
for (i = 0; i < 5; i++)
if (score > hiScores[i]) //Если счет больше, чем текущий рекорд, то поместить результат игры в список рекордов
break;
// поместить результат в список рекордов.
if (i < 5) {
for (int j = 4; j > i; j–) { //Цикл смещает меньшие результаты в конец списка рекордов
hiScores[j] = hiScores[j – 1];
}
hiScores[i] = score;
}
}Метод updateHiScores() сначала проверяет, попадает ли результат, набранный игроком, в список рекордов. Если да, то он добавляется в список рекордов, при этом наименьший результат удаляется из списка. В списке рекордов содержится не более 5 записей, поэтому прежние рекорды уступают место новым. Помните, что список рекордов временно хранится в памяти телефона, пока игра существует, данные не будут помещены в хранилище, если не будет вызван метод stop().
Последнее необходимое изменение кода игры Space Out 2 касается метода draw(), который будет выводить список рекордов на игровой заставке. В листинге 19.4 приведен код метода draw().
Листинг 19.4. Метод draw() выводит заставку и список рекордов по окончании игрыprivate void draw(Graphics g) {
// вывести фоновое изображение звездного неба
g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
// вывести слои
layers.paint(g, 0, 0);
if (gameOver) {
// вывести изображение заставки и список рекордов
g.drawImage(splash, 90, 10, Graphics.TOP | Graphics.HCENTER);
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_LARGE));
for (int i = 0; i < 5; i++)
g.drawString(Integer.toString(hiScores[i]), 90, 90 + (i * 15),
Graphics.TOP | Graphics.HCENTER);
}
else {
// вывести оставшееся число автомобилей и счет
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);
}
// вывести графику на экран