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()
. Первый метод будет вызваться, когда пользователь будет кликать левой кнопкой мыши по ячейкам игрового поля, второй метод будет вызываться при клике правой кнопкой мышки.
В параметры методов (x,y)
игровой движок JavaRush передаст координаты ячейки игрового поля, на которой произошёл клик мышкой.
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);
}
}
}
4. Список поддерживаемых кнопок
Когда движок JavaRush вызывает методы onKeyPress()
и onKeyReleased()
, он передает в них информацию о нажатой клавише. Для этого в движке JavaRush есть специальный тип — Key
.
В текущей версии движка тип Key
может принимать только ограниченный набор значений (9 шт):
Значение | Что нажал пользователь |
---|---|
|
Пользователь нажал кнопку Enter |
|
Пользователь нажал кнопку Esc |
|
Пользователь нажал кнопку Pause |
|
Пользователь нажал Пробел |
|
Пользователь нажал Стрелку Влево |
|
Пользователь нажал Стрелку Вправо |
|
Пользователь нажал Стрелку Вверх |
|
Пользователь нажал Стрелку Вниз |
|
Любая клавиша, кроме вышеперечисленных |
Если игрок нажмет пробел, то вызовется метод 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 шагов) цвет перестанет меняться — таймер выключится.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ