Раздел В этой лекции подробно расскажем о методах обработки событий при написании проектов-игр.

1. Работа с мышкой

Для работы с мышкой у игрового движка есть два метода:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
Ты просто объявляешь эти методы в классе игры, унаследованном от Game, и пишишь в них любой код. А движок сам будет их вызывать, когда пользователь нажимает кнопки мышки.
  1. onMouseLeftClick(int x, int y) — вызывается движком при клике левой кнопкой мыши. В качестве аргументов получает координаты клетки игрового поля, где произошел клик. Левая верхняя ячейка имеет координаты (0,0). Для использования этого метода, его нужно переопределить.

  2. onMouseRightClick(int x, int y) — вызывается при клике правой кнопкой мыши. Работает аналогично методу onMouseLeftClick(int x, int y).
Пример использования методов:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onMouseLeftClick(int x, int y) {
        // Ставим символ "X" в клетку по которой кликнули левой кнопкой мыши
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Очищаем клетку по которой кликнули правой кнопкой мыши
        setCellValue(x, y, "");
    }
}

2. Работа с клавиатурой

Для работы с клавиатурой у движка есть два метода:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
Если ты хочешь, чтобы при нажатии пользователем кнопки на клавиатуре осуществлялись действия, объяви эти методы в классе игры, унаследованном от Game, и напиши в них ваш код. Игровой движок сам их вызовет, когда пользователь нажмет или отпустит клавишу клавиатуры.
  1. onKeyPress (Key key) — вызывается при нажатии любой клавиши клавиатуры. В качестве аргумента key в метод передается значение нажатой клавиши (или Key.UNKNOWN).

  2. onKeyReleased (Key key) — вызывается при отпускании любой клавиши клавиатуры. В качестве аргумента key получает значение соответствующей клавиши (или Key.UNKNOWN).
Пример использования методов:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onKeyPress(Key key) {
        // При нажатии пробела, центральная клетка становится желтой
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // При отпускании пробела, центральной клетке возвращается белый цвет
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
Важно! В текущей версии движка значение аргумента типа Key может принимать только ограниченный набор значений (9 шт):
Значение Что нажал пользователь
Key.ENTER Пользователь нажал кнопку Enter
Key.ESCAPE Пользователь нажал кнопку Esc
Key.PAUSE Пользователь нажал кнопку Pause
Key.SPACE Пользователь нажал Пробел
Key.LEFT Пользователь нажал Стрелку Влево
Key.RIGHT Пользователь нажал Стрелку Вправо
Key.UP Пользователь нажал Стрелку Вверх
Key.DOWN Пользователь нажал Стрелку Вниз
Key.UNKNOWN Любую клавишу, кроме вышеперечисленных

3. Работа с таймером

Многие игры происходят в реальном времени, то есть даже если пользователь ничего не делает, события в игре все равно выполняются. Чтобы ты мог реализовывать такие игры, мы добавили в игровой движок работу с таймером. Работает это примерно так: включаешь таймер и выставляешь временной отрезок, через который он должен срабатывать. Например, 500 миллисекунд. После этого каждые полсекунды движок вызывает метод onTurnTimer(). Бесконечное число раз, пока таймер не выключат. Как же пользоваться таймером?
  1. Включаем таймер.

    Для этого есть специальный метод void setTurnTimer(int timeMs). В качестве аргумента метод принимает длительность интервала между вызовами в миллисекундах (1/1000 секунды). Достаточно один раз вызвать его, и игровой движок начнет вызывать метод onTurn() каждые timeMs миллисекунд.

  2. Переопределяем метод onTurn(int).

    Для этого необходимо объявить метод void onTurn(int step) в классе, унаследованном от класса Game. Этот метод будет вызываться игровым движком. При этом движок каждый раз будет передавать в метод порядковый номер такого вызова (1,2,3, …). Его можно назвать тактом

  3. Выключаем таймер.

    Если таймер больше не нужен, когда, например, пользователь прошел игру, его можно выключить. Для этого нужно просто вызвать метод stopTurnTimer().

  4. Ускоряем или меняем таймер.

    В некоторых играх события постоянно ускоряются, поэтому было бы удобно ускорять наш таймер (уменьшать время между вызовами). Нет ничего проще: вызови setTurnTimer(int timeMs) еще раз, с новым значением, и время между вызовами onTurn() изменится.

Пример:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {@Override
    public void initialize() {
    	// Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   //Включаем таймер, интервал между вызовами – 500мс.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // если прошло 100 тактов, выключаем таймер
        }

        if (step % 2 == 1) {
            // Если данный такт нечётный, установить клетке красный фон
            setCellColor(1, 1, Color.RED);
        } else {
            //если данный такт чётный, установить клетке синий фон
            setCellColor(1, 1, Color.BLUE);

        }
    }}
В этом простом примере мы создали поле размером 3x3 клетки. Затем включили таймер, который каждые полсекунды будет вызывать метод onTurn(). Каждые полсекунды будет меняться цвет клетки, при этом ее контент не изменится. Через 50 секунд цвет перестанет меняться.