Майкл Моррисон - Создание игр для мобильных телефонов
Как видно из списка, только клавиши LEFT_PRESSED, RIGHT_PRESSED, UP_PRESSED, DOWN_PRESSED и FIRE_PRESSED будут гарантированно поддерживаться на всех мобильных телефонах; остальные клавиши являются опциональными.
Конструктор
Класс GameCanvas имеет только один конструктор, принимающий один параметр, который определяет, можно ли использовать механизм управления, заданный в J2ME, по умолчанию: GameCanvas(boolean suppressKeyEvents).
Класс GameCanvas предлагает свою методику обработки нажатий клавиш, getKeyStates(), следовательно, большинство игр не используют стандартную систему реагирования на нажатия клавиш в J2ME. Поэтому многие игры напрямую обращаются к конструктору GameCanvas, позволяющему отключить методику восприятия нажатий клавиш по умолчанию. Методика getKeyStates() более эффективна, так как она не конфликтует с обычной системой восприятия клавиш. Если ваша игра использует смешанный подход к обработке нажатий клавиш, вам необходимо передать конструктору команду «false», чтобы активировать методику обработки нажатий клавиш по умолчанию.
Методы
В классе GameCanvas поддерживаются следующие методы:
► Graphics getGraphics() – получает объект Graphics для рисования на игровой схеме;
► void flushGraphics() – обнуляет буфер экрана и позволяет отобразить графические объекты на экране телефона;
► void flushGraphics(int x, int y, int width, int height) – обнуляет отдельную область буфера экрана и позволяет отобразить графические объекты в данной области;
► int getKeyStates() – считывает состояние клавиш игры (для определения состояния каждой клавиши используются константы, являющиеся масками бита);
► void paint(Graphics g) – рисует схему игры.
Для поддержки графики с двойной буферизацией в мобильной игре вам достаточно нарисовать графический объект, считанный с помощью функции getGraphics(), а затем отобразить данный объект на экране, используя функцию flushGraphics().
Класс Layer
Класс Layer представляет в мобильной игре общий графический объект; он является базовым классом для таких классов, как Sprite и TiledLayer. Несмотря на то что вы напрямую не создаете объекты Layer, вам необходимо регулярно применять методы класса Layer во время работы со спрайтами и вложенными классами.
Методы
В классе Layer поддерживаются следующие методы:
► int getX() – считывает положение верхнего левого угла слоя по оси X относительно системы координат объекта (canvas или layer manager);
► int getY() – считывает положение верхнего левого угла слоя по оси Y относительно системы координат объекта (canvas или layer manager);
► int getWidth() – считывает ширину слоя (в пикселях);
► int getHeight() – считывает высоту слоя (в пикселях);
► void setPosition(int x, int y – считывает положение верхнего левого угла слоя по осям X и Y относительно системы координат объекта (canvas или layer manager);
► void move(int dx, int dy) – изменяет положение слоя по осям X и Y на указанное значение по горизонтали и вертикали (в пикселях);
► boolean isVisible() – считывает видимость слоя;
► void setVisible(boolean visible) – настраивает видимость слоя;
► abstract void paint(Graphics g) – рисует слой при условии, что он видимый.
Эти методы обеспечивают доступ к таким стандартным параметрам слоя, как положение по осям X и Y, ширина, высота и видимость. Помните о том, что данные методы поддерживаются и классами Sprite, и TiledLayer (так как они происходят от класса Layer).
Класс Sprite
Модели класса Sprite являются двухмерными спрайтами, которые могут перемещаться и изменять параметры анимации одновременно. Спрайт перемещается путем изменения положения по осям X и Y, а изменение его внешнего вида достигается с помощью группы анимационных кадров, которые входят в состав изображения спрайта. Все анимационные кадры имеют одинаковые размеры, а кадры располагаются в изображении по порядку. По умолчанию спрайт содержит последовательность анимации, в которой анимационные кадры располагаются так же, как и на изображении. Чтобы создать уникальные эффекты анимации для спрайта, вы можете настроить анимационную последовательность любым способом.
Также вы можете трансформировать спрайты, то есть вращать и/или зеркально отображать их, чтобы уменьшить количество необходимых изображений. Кроме того, спрайты содержат пиксель ссылки (reference pixel), который является координатой по осям X и Y спрайта. Вы можете использовать этот пиксель для ссылки на спрайт (вместо левого верхнего угла спрайта, использующегося для ссылки по умолчанию). Действия и трансформации спрайта связаны с пикселем ссылки, что, в свою очередь, упрощает осмысленное управление спрайтом.
Member Constants
В классе Sprite заданы следующие константы, которые используются для идентификации трансформаций, применимых к спрайту:
► TRANS_NONE – спрайт никак не трансформируется;
► TRANS_ROT90 – спрайт вращается по часовой стрелке на 90 градусов;
► TRANS_ROT180 – спрайт вращается по часовой стрелке на 180 градусов;
► TRANS_ROT270 – спрайт вращается по часовой стрелке на 270 градусов;
► TRANS_MIRROR – спрайт наклоняется по вертикальной оси;
► TRANS_MIRROR_ROT90 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 90 градусов;
► TRANS_MIRROR_ROT180 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 180 градусов;
► TRANS_MIRROR_ROT270 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 270 градусов.
Эти константы трансформации применяются посредством методы setTransform() и позволяют вам создавать в спрайте различные эффекты, связанные с вращением и зеркальным отображением.
Конструкторы
Для создания спрайтов в классе Sprite поддерживаются следующие конструкторы:
► Sprite(Image image) – создает основанный на изображении, не содержащий анимации спрайт;
► Sprite(Image image, int frameWidth, int frameHeight) – создает анимированный спрайт, основанный на изображении. Данный спрайт содержит кадры анимации (размер и количество кадров определяется заданной шириной и высотой кадра);
► Sprite(Sprite s) – создает один спрайт из другого.
Первые два конструктора позволяют вам создавать неанимированные и анимированные спрайты, соответственно, а третий конструктор используется только для копирования спрайта.
Методы
В классе Sprite поддерживаются следующие методы:
► void setFrameSequence(int[] sequence) – задает последовательность анимационных кадров для спрайта;
► void nextFrame() – настраивает текущий кадр спрайта на следующий кадр в анимационной последовательности;
► void prevFrame() – настраивает текущий кадр спрайта на предыдущий кадр в анимационной последовательности;
► int getFrame() – считывает индекс текущего кадра спрайта в последовательности кадров;
► void setFrame(int sequenceIndex) – настраивает текущий кадр спрайта в анимационной последовательности на определенный индекс кадра;
► int getFrameSequenceLength() – считывает количество кадров в анимационной последовательности;
► int getRawFrameCount() – считывает количество анимационных кадров для спрайта, указанное в изображении спрайта;
► void setImage(Image img, int frameWidth, int frameHeight) – задает для спрайта определенное изображение;
► boolean collidesWith(Image image, int x, int y, boolean pixelLevel) – проверяет наличие конфликта между спрайтом и изображением в определенном положении по осям X и Y (последний параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► boolean collidesWith(Sprite s, boolean pixelLevel) – проверяет наличие конфликта между двумя спрайтами (второй параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► boolean collidesWith(TiledLayer t, boolean pixelLevel) – проверяет наличие конфликта между спрайтом и вложенным слоем (второй параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► void defineCollisionRectangle(int x, int y, int width, int height) – создает прямоугольник границы для спрайта. Данный прямоугольник предназначен для распознавания конфликтов прямоугольника (часто он меньше, чем сам спрайт; это позволяет учесть спрайты, не имеющие прямоугольной формы);
► void defineReferencePixel(int x, int y) – создает для спрайта пиксель ссылки, который используется для перемещения и трансформации спрайта вместо его левого верхнего угла;
► int getRefPixelX() – считывает положение пикселя ссылки спрайта по оси X относительно системы координат (canvas или layer manager);
► int getRefPixelY() – считывает положение пикселя ссылки спрайта по оси Y относительно системы координат (canvas или layer manager);
► void setRefPixelPosition(int x, int y) – задает положение пикселя ссылки слоя по осям X и Y относительно системы координат объекта (canvas или layer manager);
► void setTransform(int transform) – настраивает трансформацию спрайта (для указания типа трансформации используются константы трансформации);
► void paint(Graphics g) – рисует спрайт, если он видимый.
Данные методы поддерживают большое количество функций спрайта, например, создание анимационной последовательности, распознавание конфликтов, работу с пикселем ссылки и добавление трансформаций.
Класс TiledLayer