JavaRush /Java блог /Random UA /Розділ "Ігри" на JavaRush: Обробка подій

Розділ "Ігри" на JavaRush: Обробка подій

Стаття з групи Random UA
"Ігри" від 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.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.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.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.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.codegym.engine.cell.Color;
import com.codegym.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 секунд колір перестане змінюватися. На цьому все! Якщо ви хочете дізнатися про розділ "Ігри" більше, ось корисна документація, яка може допомогти.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ