Пример #2
Комментарии к примеру

FAQ (ЧАВО) по мобилам, цифровому фото, КПК и не только...
Обсудить на форуме
< Перейти к другим примерам

Arcanum © 15.02.2004
При цитировании ссылка на faqsite.narod.ru обязательна

Перечень классов, входящих в проект

В проект входят несколько классов, каждый из которых выполняет свою задачу, а именно:
Класс 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)

При выборе пункта списка обрабатывается соответствующий пункт меню:

  1. New - конструируем MainCanvas, запускаем в нем поток отрисовки дисплея (см. далее) и делаем видимым.
  2. Resume - запускаем вновь приостановленный поток в MainCanvas (см. далее) и показываем игровой дисплей.
  3. High scores - конструируем HiScoreCanvas и делаем видимым.
  4. Settings - конструируем SetCanvas и делаем видимым.
  5. Help - конструируем Alert с подсказкой и делаем его видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
  6. About - конструируем Alert с информацией об авторстве и его делаем видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
  7. Exit - вызываем статический метод 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


Rambler's Top100
Hosted by uCoz