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

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

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

Примерный сценарий разработки

  1. Взят за основу заготовку BaseMidlet
  2. Переписан с нуля класс MainCanvas, нарисованы картинки.
  3. Сильно доработан класс DataStore
  4. Переписан класс SetList
  5. Собранный мидлет автоматически обработан обфускатором RetroGuard.

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


Класс RenjuBoard

Загрузчик, показывающий заставку и запускающий главное меню.
Класс SplashCanvas

Заставка, появляющаяся сразу после загрузки мидлета. Выход из нее осуществляется нажатием на любую кнопку.
Класс MenuList

Основное меню, из которого происходит запуск игры, загрузка сохраненной партии, вызов настроек.
Класс MainCanvas

Отвечает за прорисовку игрового поля, использует вспомогательный класс Board.
Класс Board

Выполняет основную работу по отрисовке доски и реагирует на действия игроков.
Класс DataStore

Записывает и считывает настройки, используя хранилище мидлета RecordStore.
Класс SetData

Вспомогательный класс для работы совместно с DataStore.
Класс BoardData

Вспомогательный класс для работы совместно с DataStore.
Класс SetList

Позволяет изменять настройки, которые хранит при помощи класса DataStore.

Описание классов

Класс RenjuBoard

Как обычно, унаследован от MIDlet. Не имплементирует CommandListener, поскольку сразу же показывает заставку SplashCanvas, в которой идет обработка кнопок.

Содержит статическую переменную static MIDlet midlet, используемую для вызова статической функции exitMidlet().

Класс SplashCanvas

Унаследован от Canvas. Считывает картинку из jar-архива, в методе paint(...) показывает ее. Обработчик кнопок keyPressed(...) по нажатию любой кнопки конструирует и показывает главное меню MenuList.

Класс MenuList

Унаследован от List, осуществляет интерфейс CommandListener.

На подготовительном этапе, загружает иконки для списка: createImage(...), конструирует список посредством append(...) и устанавливает обработчик команд: setCommandListener(this)

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

  1. New game - конструируем MainCanvas, инициализируем настройки для новой игры start(...), делаем сконструированный класс видимым.
  2. Open saved - вызываем метод resume(...) который загрузит данные сохраненной доски, затем показываем доску.
  3. Settings - конструируем SetCanvas и делаем видимым.
  4. Help - конструируем Alert с подсказкой и делаем его видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
  5. About - конструируем Alert с информацией об авторстве и его делаем видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
  6. Exit - вызываем статический метод exitMidlet()класса RenjuBoard.

Класс MainCanvas

Унаследован от Canvas и использует интерфейс CommandListener.

Основная функциональность ложится на встроенный класс Board (см. далее)

Для реализации интерфейса определяем функцию commandAction(...) которая отрабатывает команда для выхода с сохранением позиции на доске, или без сохранения.

Методы start(...) и resume() предназначены для начала новой игры и, соответственно, открытия сохраненной партии.

Метод paint(...) автоматически вызывается либо по нажатию кнопки, либо по таймеру в Board.

Метод keyPressed(...) вызывает соответствующий метод Board.

Класс Board

Поскольку мы имеем дело с пошаговой игрой, то здесь я отказался от использования дополнительных потоков. Перерисовка доски происходит либо по нажатию на кнопку, когда перемещается курсор, либо по секундному таймеру, для отображения оставшегося времени.

Используется два таймера - для белых и для черных. Таймеры идут все время, однако время уменьшается, когда ход делает соответствующий игрок.

Метод resume() использует класс DataStore и получает сохраненную позицию на доске.

Обратите внимание, что использование классов MelodyComposer и Light приводит к тому, что мидлет не будет запускаться на телефонах, отличных от Siemens - прощай переносимость.

Метод drawNumber(...) выводит число, используя картинку-шаблон 'dig.png'. Это пример того, как можно применить собственный шрифт. Здесь это вызвано необходимостью отобразить достаточно мелкий, нестандартный шрифт.

Методы drawMoveState(), drawTurnState(), drawTimeState() показывают статус текущей игровой ситуации.

Метод makeMove() проверяет возможность хода, и если ход возможен, устанавливает за клеткой номер текущего хода.

Метод drawBoard() перерисовывает всю доску, используя фоновую картинку 'bd.png' и картинки камней.

Класс DataStore

Все основные функции берет на себя библиотечный класс RecordStore переменную данного типа store мы и используем.

Родной структурой для хранения в классе RecordStore является массив byte[], поэтому весьма удобно воспользоваться вспомогательными потоковыми классами: ByteArrayOutputStream и DataOutputStream

Метод openStore() открывает, или создает хранилище. Если хранилище было создано, то создаем в нем запись, вызывая initData()

Класс SetList

Унаследован от List. Реализован простой список List.IMPLICIT, однако элементы списка могут менять свои названия в зависимости от установок.

При загрузке, инициализируем выбранные пункты, основываясь на DataStore

Реализуем интерфейс CommandListener. Меняем настройки в соответствии с командой. По возврату - сохраняем настройки, используя DataStore


Rambler's Top100
Hosted by uCoz