Программирование двухмерных игр на J2ME - GameCanvas («игровой холст»)

ОГЛАВЛЕНИЕ

GameCanvas («игровой холст»)

Как элемент низкоуровневой библиотеки пользовательского интерфейса, при объединении с GraphicsGameCanvas предоставляет нам гибкие инструменты создания нашего собственного игрового экрана. С помощью Graphics вы, по сути, можете рисовать то, что вы обычно можете создать в двухмерном Java, включая рисование фигур, строк или изображений. GameCanvas – это расширение исходного Canvas (холста), предоставляющее больше возможностей контроля над рисованием и повышающее скорость реакции игры на нажатия кнопок. (графика)

Используя GameCanvas, вы можете заметить, что его возможности включают в себя скрытую буферизацию. Когда вы рисуете что-либо, скорее всего, вы выполняете это за пределами экрана и с помощью вызова метода flushGraphics() выводите содержимое буфера на экран.

GameCanvas также упрощает процесс получения входных данных, позволяя нам запрашивать состояние ключа, используя метод getKeyState(). Обработка состояния кнопки, однако, передается GameManager (средство управления игрой) для облегчения управления игрой. 

Начало системы координат игры расположено в верхнем левом углу экрана, как показано на рисунке.

В методе render (отображение) внеэкранный буфер очищается, и графика отображается с помощью вызова метода paint, принадлежащего GameManager.  

public void render(Graphics g) {

        ……..
       // Очистка холста.
        g.setColor(0, 0, 50);
        g.fillRect(0,0,WIDTH-1,HEIGHT-1);
        ….….
        gameManager.paint(g);
    }

В данном примере SSGameCanvas реализует интерфейс Runnable (работоспособный), что приводит к созданию методов run(), в которых мы создаем замкнутый цикл (петлю) игры, выполняющийся до тех пор, пока не будет достигнуто определенное условие завершения.

Замкнутые циклы игры

  public void run() {

 
        while (running) {
            // рисование графики
            render(getGraphics());
            // продвижение к следующему циклу (такту)
            advance(tick++);
            // отображение
            flushGraphics();
            try { Thread.sleep(mDelay); }
            catch (InterruptedException ie) {}
        }
    }

Расчет времени в игре контролируется целым числом, названным tick. tick упрощает задачу задания времени в игре, такую как темп стрельбы корабля, или то, как долго будет сверкать звезда, или то, как долго спрайт будет входить в следующий кадр. Если расчет времени выполняется в GameCanvas путем реализации Runnable, tick имеет значение mDelay + время, необходимое для завершения одного игрового цикла (миллисекунды). Если мы создаем поток, который берет на себя управление tick, мы, скорее всего, будем иметь tick = mDelay. Вероятно, нам понадобится только 24 -30 кадров в секунду, поэтому мы ограничиваем mDelay таким образом, чтобы иметь требуемый анимационный эффект и при этом потреблять меньше энергии. Во время каждого цикла игры мы вызываем метод продвижения GameManager, который расширяет LayerManager, чтобы проверить ввод пользователя, столкновения и нарисовать графику.

public void advance(int ticks) {
       // продвижение к следующему игровому холсту
        gameManager.advance(ticks);
        this.paint(getGraphics());
    }
}

tick  может иметь ограничение: он ограничивает продолжительность игры предельным значением целого числа, что составляет примерно 590 часов в 32-разрядной системе.