JavaRush /Java блог /JavaRush /Раздел "Игры" на JavaRush: Обработка событий
Зепп Бранниган
41 уровень

Раздел "Игры" на JavaRush: Обработка событий

Статья из группы JavaRush
«Игры» от JavaRush — новый раздел с интересными и масштабными задачами по созданию своих версий популярных игр. Все просто: каждый проект-игра разделен на подзадачи. Выполните их одну за другой — игра готова. Ею можно поделиться в соцсетях и пригласить друзей поиграть.Раздел В этом материале подробно расскажем о методах обработки событий при написании игр.

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 секунд цвет перестанет меняться. На этом все! Если вы хотите узнать о разделе "Игры" больше, вот полезная документация, которая может в этом помочь:
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Fermi Arch Уровень 24
1 ноября 2022
было бы неплохо добавить onMouseOver метод тогда можно было бы подсвечивать клетки например и еще бы в диалог возможность ввода поля тогда бы можно было вопрос ответы делать или числа вбивать или текст чтобы что то менялось в зависимости от ответа
Septima Melody Уровень 5
14 октября 2021
не очень понятно зачем setScreenSize(x, y) имеет два параметра, когда нельзя по человечески сделать не квадратное поле.
Дворник Уровень 41
22 апреля 2020
Не выводит score
Алексей Уровень 17
26 марта 2019
Как изменить размер экрана повторно? После первой инициализации повторный вызов setScreenSize() задает новый размер, но экран никак не реагирует на вызов других методов.