for (int i = 1; i <= rs.getNumRecords(); i++) {
// выделить память при необходимости
if (rs.getRecordSize(i) > recordData.length) //Если размер записи больше 8 байт, этот код выделяет необходимый объем памяти
recordData = new byte[rs.getRecordSize(i)];
// считать данные в массив
len = rs.getRecord(i, recordData, 0);
// Do something with the record data
... //Здесь вы напишете игровой код, конвертирующий и сохраняющий данные в обычный формат, например, int
}
}
catch (Exception e) {
System.err.println("Failed reading hi scores!");
}
Этот код показывает, как пройти по всем записям хранилища, считывая по одной записи. Важно отметить, что при необходимости выделяется память для записи. Обычно этого не требуется при работе со списком рекордов, поскольку все записи в данном случае имеют приблизительно одинаковый размер, но осторожность не повредит. Есть ряд ситуаций, когда может потребоваться удалить все хранилище записей. К счастью, в классе RecordStore для этого есть статический метод deleteRecordStore(). Все, что необходимо сделать, – это передать ему название хранилища записей, например, так:
try {
Rs.deleteRecordStore("HiScores");
}
catch (Exception e) {
System.err.println("Failed deleting record store!");
}
Метод deleteRecordStore() полезен в тех случаях, когда вам не нужны данные старого хранилища, а вы хотите записать новое. Этот прием будет использован дальше в этой главе, когда вы будете обновлять содержимое списка рекордов игры Space Out. Вместо того чтобы искать и изменять конкретную запись в хранилище, игра Space Out 2 удаляет старое хранилище и записывает новое. Об этом вы узнаете чуть позже в этой главе. Тем временем метод closeRecord() – последний метод класса RecordStore, который интересен с точки зрения программирования мобильных игр. Этот метод необходим для закрытия хранилища записей по окончании работы с ним:
try {
rs.closeRecordStore();
}
catch (Exception e) {
System.err.println("Failed closing hi score record store!");
}
Хотя про хранилища записей и поддержку MIDP API Системы управления записями можно сказать намного больше, вам необходимо знать лишь то, что поможет добавить интересные штрихи в создаваемые вами мобильные игры. Поэтому оставшаяся часть главы посвящена добавлению списка рекордов в игру Space Out, разработанную в предыдущей главе.
Подготовка списка рекордов к хранению
Я бы хотел научить вас создавать список рекордов (одну из особенностей классических аркад), в который можно вводить ваше имя или инициалы. К сожалению, эта задача достаточно сложна с точки зрения программирования. Если быть более точным, то необходимо отступить от темы повествования, не углубляясь в детали. Поэтому вместо списка рекордов, хранящего имена и счет лучших пяти игроков, вы создадите список рекордов, содержащий лишь лучшие 5 результатов. Хотя при этом имена рекордсменов будут неизвестны, тем не менее такой способ хорош для отражения лучших достижений.
...
В копилку Игрока
Поскольку мы имеем дело с мобильными телефонами – персональными устройствами, в списке рекордов в большинстве случаев будете присутствовать только вы. Поэтому ввод имени рекордсмена не столь необходим.
Поскольку нет необходимости сортировать имена, вам придется сортировать лишь счет игры. Если вы вспомните, то в игре Space Out счет– это четырехразрядное число (то есть меньше 10000), что означает, переменная типа int хорошо подходит для его хранения. Однако вы знаете, что данные в хранилище записей хранятся как массивы байтов. Следовательно, необходимо конвертировать данные в массив байтов и обратно.
Давайте рассмотрим конвертирование целых чисел в байтовый массив с точки зрения создания одной записи. Идея заключается в том, чтобы одно целое число преобразовать в массив типа byte. Ниже приведен код, выполняющий это:
byte[] recordData = Integer.toString(hiScore).getBytes();
В этом примере рекорд хранится в переменной hiScore, которая сначала преобразуется в строку, для чего вызывается метод Integer.toString(). Затем эта строка преобразуется в массив байтов методом getBytes(). Все, что необходимо, – это одна строка кода, и целое число преобразовано в массив байтов. На рис. 19.2 представлена графическая иллюстрация этого процесса.
Рис. 19.2. Чтобы преобразовать целое число в массив байтов, сначала необходимо конвертировать его в строку
Преобразование данных о рекордах в нужный формат – это важная задача, которая решается обратным конвертированием. Используя тип string как промежуточный тип, массив байтов преобразуется в целое число. Приведенный ниже код выполняет это:
hiScore = (Integer.parseInt(new String(recordData, 0, len)));
Конструктор String(), используемый в этом коде, принимает массив байтов, смещение и число конвертируемых байтов. Переменная len, которая хранит число конвертируемых данных, содержит число, возвращенное методом getRecord(), считывающим запись. Затем строка передается в статический метод Integer.parseInt(), преобразующий строку в целое число. Рисунок 19.3 иллюстрирует процесс обратного конвертирования (массива байтов в целое число).
Читать дальше
Конец ознакомительного отрывка
Купить книгу