BaseMidl
Загрузчик, показывающий заставку и запускающий главное меню.
Класс SplashCanvas
Заставка, появляющаяся сразу после загрузки мидлета. Выход из нее осуществляется нажатием на любую кнопку.
Класс MenuList
Основное меню, из которого происходит запуск игры, вызов настроек, таблицы рекордов.
Класс MainCanvas
Отвечает за прорисовку игрового поля, может использовать вспомогательные классы, описывающие специфику игры.
Класс DataStore
Записывает и считывает настройки, используя хранилище мидлета RecordStore
.
Класс HiScoreCanvas
Отображает таблицу рекордов, использует класс DataStore
для хранения информации.
Класс SetList
Позволяет изменять настройки, которые хранит при помощи класса DataStore
.
BaseMidl
Как обычно, унаследован от MIDlet
. Не имплементирует CommandListener
, поскольку сразу же показывает заставку SplashCanvas
, в которой идет обработка кнопок.
Содержит статическую переменную static MIDlet midlet
, используемую для вызова статической функции exitMidlet()
.
SplashCanvas
Унаследован от Canvas
. Считывает картинку из jar-архива, в методе paint(...)
показывает ее. Обработчик кнопок keyPressed(...)
по нажатию любой кнопки конструирует и показывает главное меню MenuList
.
MenuList
Унаследован от List
, осуществляет интерфейс CommandListener
.
На подготовительном этапе, загружает иконки для списка: createImage(...)
, конструирует список посредством append(...)
и устанавливает обработчик команд: setCommandListener(this)
При выборе пункта списка обрабатывается соответствующий пункт меню:
MainCanvas
, запускаем в нем поток отрисовки дисплея (см. далее) и делаем видимым.
MainCanvas
(см. далее) и показываем игровой дисплей.
HiScoreCanvas
и делаем видимым.
SetCanvas
и делаем видимым.
Alert
с подсказкой и делаем его видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
Alert
с информацией об авторстве и его делаем видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
exitMidlet()
класса BaseMidl
.
MainCanvas
Унаследован от Canvas
и использует интерфейс Runnable
.
Для реализации интерфейса определяем переменную - рабочий поток Thread thread
. Этот поток будет использоваться для требования отрисовки - вызов метода repaint()
.
Методы pause()
и resume()
предназначены для приостанова и, соответственно, запуска потока после приостанова. Для устранения эффекта гонок (race condition) они сделаны synchronized
.
Метод run()
представляет собой рабочую функцию потока, он просчитывает следующую фазу анимации. Обратите внимание на стандартную реализацию приостановки потока - цикл while(!bWorking)
.
Метод paint(...)
автоматически вызывается при необходимости перерисовки. Обратите внимание на реализацию двойной буферизации (double buffering), когда сначала рисуется изображение на невидимой картинке, которая потом показывается на дисплее. Это устраняет возможный эффект мерцания.
Также здесь показано применение метода setClip(...)
для показа фазы анимации, являющейся частью картинки.
Метод keyPressed(...)
просто возвращает в главное меню, предварительно приостановив выполнение отрисовки.
DataStore
Все основные функции берет на себя библиотечный класс RecordStore
переменную данного типа store
мы и используем.
Родной структурой для хранения в классе RecordStore
является массив byte[]
, поэтому вокруг этого и работают вспомогательные методы fillStorageData()
и parseStorageData(...)
.
В данном примере реализована только загрузка loadSettings()
и сохранение saveSettings()
установок. В принципе, еще нужно сохранять информацию о рекордах и игровую ситуацию, чтобы продолжать игру после перезапуска мидлета.
Метод openStore()
открывает, или создает хранилище. Если хранилище было создано, то создаем в нем запись, вызывая initData()
HiScoreCanvas
Унаследован от Canvas
. Вам нужно будет добавить еще методы для определения рейтинга и чтения/сохранения его в DataStore
В принципе, в данной реализации практически ничем не отличается от SplashCanvas
SetList
Унаследован от List
. Реализован список с независимым выбором пунктов List.MULTIPLE
При загрузке, инициализируем выбранные пункты, основываясь на DataStore
Реализуем интерфейс CommandListener
. Обработчик команд в данном случае игнорирует все команды, кроме возврата в главное меню. По возврату - сохраняем настройки, используя DataStore