MainCanvas
, нарисованы картинки.
DataStore
SetList
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)
При выборе пункта списка обрабатывается соответствующий пункт меню:
MainCanvas
, инициализируем настройки для новой игры start(...)
, делаем сконструированный класс видимым.
resume(...)
который загрузит данные сохраненной доски, затем показываем доску.
SetCanvas
и делаем видимым.
Alert
с подсказкой и делаем его видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
Alert
с информацией об авторстве и его делаем видимым. После нажатия на OK, автоматически произойдет возврат обратно в меню.
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