Программирование мобильных телефонов

Класс GameCanvas




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


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

Содержание раздела