Класс 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 у) – устанавливает уровень в позицию, обозначенную в координатах х и у.