1. Вступ
Від ігрового рушія було б мало користі, якби ми просто могли з його допомогою малювати щось на екрані. Для написання повноцінної гри їй потрібно взаємодіяти з користувачем! А якщо точніше, наша програма повинна відстежувати дії користувача і реагувати на них.
Для цього у ігрового рушія CodeGym є спеціальні методи, які він викликає, коли користувач натискає клавіші мишки або кнопки на клавіатурі.
Весь клас в тому, що пишете ці методи ви самі, а за виклик їх відповідає ігровий рушій CodeGym. Все, що вам потрібно — оголосити ці методи у своєму коді. Це працює ще простіше, ніж звучить.
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.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, "");
}
}
У прикладі вище ми оголосили обидва методи: onMouseLeftClick() і onMouseRightClick(). Перший метод викликається, коли користувач натискає лівою кнопкою миші на комірки ігрового поля, другий метод викликається при кліку правою кнопкою миші.
У параметри методів (x,y) ігровий рушій CodeGym передає координати комірки ігрового поля, на якій стався клік мишкою.
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.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);
}
}
}
4. Список підтримуваних кнопок
Коли рушій CodeGym викликає методи onKeyPress() та onKeyReleased(), він передає в них інформацію про натиснуту клавішу. Для цього в рушії CodeGym є спеціальний тип — Key.
У поточній версії рушія тип Key може приймати лише обмежений набір значень (9 шт):
| Значення | Що натиснув користувач |
|---|---|
|
Користувач натиснув кнопку Enter |
|
Користувач натиснув кнопку Esc |
|
Користувач натиснув кнопку Pause |
|
Користувач натиснув Пробіл |
|
Користувач натиснув Стрілку Вліво |
|
Користувач натиснув Стрілку Вправо |
|
Користувач натиснув Стрілку Вгору |
|
Користувач натиснув Стрілку Вниз |
|
Будь-яка клавіша, окрім вищеперелічених |
Якщо гравець натисне пробіл, то викличеться метод onKeyPress(), куди передасться параметр Key.SPACE, якщо користувач натисне стрілку вліво, то передасться параметр Key.LEFT. Якщо ж користувач натисне будь-яку клавішу, якої немає в списку вище, метод onKeyPress() буде викликаний з параметром Key.UNKNOWN.
Уся справа в тому, що існуючі ігри CodeGym спроєктовані так, щоб їх можна було запускати на телефоні. Стандартна клавіатура при цьому не показується, а відображаються 8 віртуальних кнопок:

5. Як працювати з таймером
Багато ігор відбуваються у реальному часі: тобто, користувач нічого не робить, а якісь події у грі все-таки відбуваються. Щоб ви могли реалізовувати такі ігри, ми додали до ігрового движка роботу з таймером.
Працює це приблизно так: ви вмикаєте таймер і виставляєте час, після якого він має спрацювати. Наприклад, 500 мс. І після цього кожні пів секунди Ігровий Движок CodeGym викликає метод 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.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);
}
}
...
}
У цьому простому прикладі ми створили поле 3×3 клітинки. Потім увімкнули таймер, який кожні пів секунди буде викликати метод onTurn().
При цьому кожні пів секунди буде змінюватися колір центральної клітинки. Текст клітинки при цьому не зміниться. Через 50 секунд (100 кроків) колір перестане змінюватися — таймер вимкнеться.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ