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