Другое, но очень важное изменение метода start() игры Space Out 2 касается работы метода в случае ранее наступившего окончания игры. В исходной версии игры Space Out игра начинается сразу при запуске мидлета.
В игре Space Out 2 заставка и список рекордов отображаются при первом запуске игры. Иначе говоря, игра Space Out 2 начинается в режиме «окончания игры». Поэтому в методе start() больше не вызывается метод newGame(), а переменной gameOver присваивается значение true:
gameOver = true;
Подобно тому, как список рекордов считывается в методе start(), он записывается в методе stop():
writeHiScores();
Метод writeHiScores() записывает целочисленный массив в хранилище записей. В листинге 19.2 приведен код этого метода: Листинг 19.2. Метод writeHiScores() записывает целочисленный массив HiScores в хранилище данных
private void writeHiScores()
{
// удалить предыдущее хранилище записей
try {
RecordStore.deleteRecordStore("HiScores"); //Сначала удаляется хранилище записей
}
catch (Exception e) {
}
// создать новое хранилище записей
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore("HiScores", true); //Значение true говорит о том, что если хранилище записей с указанным именем не будет найдено, то будет создано новое хранилище
}
catch (Exception e) {
System.err.println("Failed creating hi score record store!");
}
// записать рекорды
for (int i = 0; i < 5; i++) {
// подготовить данные для записи
byte[] recordData = Integer.toString(hiScores[i]).getBytes(); //Преобразовать целое число в массив байтов, чтобы записать его в хранилище
try {
// записать данные в хранилище
rs.addRecord(recordData, 0, recordData.length);
}
catch (Exception e) {
System.err.println("Failed writing hi scores!");
}
}
// закрыть хранилище
try {
rs.closeRecordStore();
}
catch (Exception e) {
System.err.println("Failed closing hi score record store!");
}
}
Метод writeHiScores() использует уникальную методику записи рекордов. Вместо того чтобы заменить отдельную запись в хранилище, заменяется все хранилище целиком. Хотя такой подход может показаться грубым, он значительно упрощает код игры. Это и объясняет, почему в начале метода writeHiScores() удаляется хранилище записей.
После того как хранилище записей удалено, метод writeHiScores() создает новое хранилище, для чего вторым параметром при вызове метода openRecordStore() передается true. Затем выполняется цикл по всем элементам массива hiScores, каждый из элементов записывается в хранилище. Когда все рекорды записаны, хранилище закрывается, для чего вызывается метод closeRecordStore().
Вы создали код, считывающий список рекордов в начале игры, и записывающий список в хранилище по окончании игры. Но я не упомянул о том, как обновляется список рекордов. При окончании игры метод 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);
Читать дальше
Конец ознакомительного отрывка
Купить книгу