1. Вступ

Від ігрового рушія було б мало користі, якби за його допомогою ми могли тільки щось малювати на екрані. Для створення повноцінної гри потрібно надати їй можливість взаємодіяти з користувачем! Тобто наша програма має відстежувати дії користувача й реагувати на них.

Для цього ігровий рушій JavaRush має спеціальні методи, які він викликає, коли користувач натискає кнопки миші або клавіші на клавіатурі.

Зручність у тому, що ці методи ви пишете самі, а за їх виклик відповідає ігровий рушій JavaRush. Усе, що вам потрібно зробити, — оголосити ці методи у своєму коді. Це працює навіть простіше, ніж звучить.


2. Робота з мишею

Для роботи з мишею ігровий рушій має два методи:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

Ви просто оголошуєте ці методи в класі своєї гри, успадкованому від класу Game, і пишете в цих методах той код, який вам потрібен. А ігровий рушій сам викличе ці методи, коли користувач натискатиме кнопки миші.

onMouseLeftClick(int x, int y) — рушій викликає цей метод, коли користувач натискає ліву кнопку миші. Як аргументи метод отримує координати клітини ігрового поля, де відбулося натискання. Ліва верхня клітина має координати (0,0). Щоб використовувати цей метод, його потрібно перевизначити: вставити перед ім'ям методу анотацію @Override.

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, "");
   }
}

У наведеному прикладі ми оголосили обидва методи: onMouseLeftClick() і onMouseRightClick(). Перший метод викликатиметься, коли користувач клацатиме по клітинах ігрового поля лівою кнопкою миші, а другий метод — коли він клацатиме правою кнопкою.

Ігровий рушій JavaRush передасть у параметри методів (x,y) координати клітини ігрового поля, на якій користувач клацнув мишею.


20
Задача
Java Syntax Zero,  20 рівень4 лекція
Недоступна
Робота з мишею
Ознайомимося з методами, що викликаються натисканням кнопок миші, і за їхньою допомогою розфарбуємо поле. У методі initialize() задай розміри поля 5х5 і зафарбуй кожну клітину в білий колір. Перевизнач метод onMouseLeftClick(int, int) класу Game так, щоб він зафарбовував у зелений колір (Color.GREE

3. Робота з клавіатурою

Для роботи з клавіатурою ігровий рушій має два методи:

void onKeyPress(Key key);
void onKeyReleased(Key key);

Якщо ви хочете виконувати певні дії, коли користувач натискає клавіші на клавіатурі, вам потрібно просто оголосити ці методи в класі вашої гри, успадкованому від класу Game.

Напишіть у цих методах свій код, а ігровий рушій сам їх викличе, коли користувач натисне (або відпустить) клавішу клавіатури.

onKeyPress(Key key) — рушій викликає цей метод, коли користувач натискає будь-яку клавішу клавіатури. Як аргумент key в метод передається значення натиснутої клавіші (або Key.UNKNOWN). Щоб використовувати цей метод, його потрібно перевизначити: вставити перед ім'ям методу анотацію @Override.

onKeyReleased(Key key) — рушій викликає цей метод, коли користувач відпускає будь-яку клавішу клавіатури. Як аргумент key в метод передається значення відповідної клавіші (або Key.UNKNOWN). Щоб використовувати цей метод, його потрібно перевизначити: вставити перед ім'ям методу анотацію @Override.

Приклад використання методів:

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);
      }
   }
}

20
Задача
Java Syntax Zero,  20 рівень4 лекція
Недоступна
Робота з клавіатурою
Настав час реалізувати методи, що викликаються натисканням клавіш. Це onKeyPress(Key) і onKeyReleased(Key). Під час запуску гри поле складається з 3x3 клітин. Тоді потрібно зробити так, щоб: під час натискання Key.LEFT було зафарбовано три ліві клітини; під час натискання Key.RIGHT було зафарбовано

4. Список підтримуваних клавіш

Коли рушій JavaRush викликає методи onKeyPress() і onKeyReleased(), він передає в них інформацію про натиснуту клавішу. Для цього рушій JavaRush має спеціальний тип — Key.

У поточній версії рушія тип Key може мати тільки обмежений набір значень — 9:

Значення Натиснута клавіша
Key.ENTER
Користувач натиснув клавішу Enter
Key.ESCAPE
Користувач натиснув клавішу Esc
Key.PAUSE
Користувач натиснув клавішу Pause
Key.SPACE
Користувач натиснув клавішу Пробіл
Key.LEFT
Користувач натиснув стрілку вліво
Key.RIGHT
Користувач натиснув стрілку вправо
Key.UP
Користувач натиснув стрілку вгору
Key.DOWN
Користувач натиснув стрілку вниз
Key.UNKNOWN
Будь-яка клавіша, крім вищезазначених

Якщо користувач натисне пробіл, то буде викликано метод onKeyPress() і передано параметр Key.SPACE, а якщо користувач натисне стрілку вліво, то буде передано параметр Key.LEFT. А якщо користувач натисне клавішу, якої немає у списку, метод onKeyPress() буде викликано з параметром Key.UNKNOWN.

Річ у тім, що ігри JavaRush розроблено таким чином, щоб їх можна було запускати на телефоні, де стандартна клавіатура не відображається, а відображаються 8 віртуальних кнопок:


5. Робота з таймером

Багато ігор працюють в режимі реального часу: тобто навіть коли користувач нічого не робить, якісь події в грі все одно відбуваються. Щоб надати вам можливість створювати такі ігри, ми додали в ігровий рушій засоби для роботи з таймером.

Це діє приблизно так: ви вмикаєте таймер і встановлюєте інтервал часу, після закінчення якого він має спрацьовувати, наприклад 500 мс. Тоді ігровий рушій JavaRush що пів секунди викликає метод onTurn(). Це відбуватиметься безліч разів, доки таймер не буде вимкнено.

Тож як користуватися таймером?

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);
      }
   }
   ...
}

У цьому простому прикладі ми створили поле розміром 3х3 клітини. Потім увімкнули таймер, який що пів секунди викликатиме метод onTurn().

Водночас що пів секунди змінюватиметься колір центральної клітини, але текст у клітині не змінюється. Через 50 секунд (100 тактів) змінення кольору припиниться — таймер вимкнеться.


20
Задача
Java Syntax Zero,  20 рівень4 лекція
Недоступна
Таймер
У методі initialize() установлюються розмір поля 3x3 і таймер на оновлення поля щосекунди (1 кадр за секунду). Тобі потрібно перевизначити й реалізувати метод onTurn(int), який має посеред поля (x = 1, y = 1) виводити змінну step. Якщо step має парне значення, слід зафарбовувати все поле зеленим кол