• Иллюстрированный самоучитель по программированию мобильных телефонов

    Класс GameCanvas. Класс Layer.

    Абстрактный класс GameCanvas составляет основу интерфейса всей создаваемой игры. Этот класс отвечает за прорисовку экрана, улучшая механизм работы игрового цикла и не используя при этом входные системные потоки. Весь игровой процесс может быть сосредоточен в одном цикле метода run () интерфейса Runnable.

    Игровой цикл, используемый классом GameCanvas, отличается от аналогичного цикла применяемого классом Canvas. Типичная проблема игрового цикла класса Canvas заключается в том, что он разбит на несколько потоков. Вывод графики происходит в одном методе, обработка событий с клавиш – в другом, а изменение состояния игрового процесса в третьем. Такая модель работы может давать сбои, поэтому в классе GameCanvas была придумана более изящная конструкция игрового цикла, располагающаяся в одном единственном цикле.

    public void run()
    {
    Graphics g = getGraphics();
    while(true)
    {
    // метод, обрабатывающий нажатия клавиш с телефона
    inputKey();
    // метод, прорисовывающий графику
    GameGraphics();
    // копирует графические элементы
    на экран из внеэкранного буфера
    flushGraphics();
    }
    

    Система прорисовки игровой графики построена на использовании двойной буферизации, без.которой невозможно создать ни одной хорошей компьютерной игры. Смысл механизма двойной буферизации заключается в использовании внеэкранного буфера. Вся игровая графика рисуется во вторичном или внеэкранном буфере и только после полного цикла отрисовки, копируется непосредственно на экран с помощью метода flushGraphics (). При этом улучшается качество самой графики и, что самое главное, до тех пор, пока игровой процесс не обновится, обработка событий с клавиш телефона является недоступной.

    Сама же обработка событий с клавиш упрощена с помощью метода getKeyState (). Вы просто определяете нажатую клавишу пописываете соответствующие игровые действия для нее. Изменены некоторые названия констант для клавиш телефона. Обработка событий с клавиш телефона происходит с помощью следующих констант:

    • static int DOWN_PRESSED – движение.вниз;
    • static int FIRE_PRESSED – реализует стрельбу из оружия;
    • static int GAME_A_PRESSED – игровая клавиша A;
    • static int GAME_B_PRESSED – игровая клавиша В;
    • static int GAME_C_PRES.SED – игровая клавиша С;
    • static int GAME_D_PRESSED – игровая клавиша D;
    • static int LEFT_PRESSED – движение влево;
    • static int RIGHT_PRESSED – движение вправо;.
    • static int UP_PRESSED – движение вверх.

    Использование констант значительно упрощает работу с объектом, а с помощью метода getKeyStates () класса GameCanvas, можно определить, какая именно клавиша нажата в данный момент. Проанализируем методы класса GameCanvas:

    • void flushGraphics () – копирует изображение из внеэкранного буфера на экран;
    • void flushGraphics(int x, int y, int width, int height) – копирует изображение из внеэкранного буфера на экран в заданный по размеру прямоугольник;
    • protected Graphics getGraphics () – получает графические элементы для представления их в последствии классом GameCanvas;
    • int getKeyStates () – определяет какая из клавиш нажата;
    • void paint (Graphics g) – рисует графические элементы, представленные классом GameCanvas.

    Класс GameCanvas создает основной цикл игрового процесса в одном потоке, наблюдает за событиями, получаемыми с клавиш телефона на основе которых производит постоянное обновление экрана.

    Класс Layer

    Абстрактный класс Layer задает основные свойства для всех созданных уровней игры.

    Класс Layer имеет два подкласса TiledLayer и Sprite. При создании любых других подклассов класса Layer необходимо реализовать метод paint () в этих классах, чтобы иметь возможность рисовать созданные уровни на экране телефона, представляемом классом Graphics. С помощью методов класса Layer можно задавать размер и позицию уровня.

    • int getHeight() – получает высоту экрана;
    • int getwidth() – получает ширину экрана;
    • int getX () – получает горизонтальную координату уровня;
    • int getY () – получает вертикальную координату уровня;
    • void move (int dx, int dy) – перемещает уровень на dx и dy координаты;
    • abstract void paint (Graphics g) – рисует уровень;
    • void setPosition (int x, int у) – устанавливает уровень в позицию, обозначенную в координатах х и у.
    Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.