1. Въведение
Игровият двигател би бил от малка полза, ако можем да го използваме само за да нарисуваме нещо на екрана. За да напишем пълноценна игра, трябва да взаимодействаме с потребителя! За да бъдем по-точни, нашата програма трябва да проследява действията на потребителите и да отговаря на тях.
За да направи това, двигателът на играта CodeGym има специални методи, които извиква, когато потребителят щракне върху бутоните на мишката or клавишите на клавиатурата.
Смисълът на класа е, че вие сами пишете тези методи и след това двигателът на играта CodeGym отговаря за извикването им. Всичко, от което се нуждаете, е да декларирате тези методи във вашия code. Това е по-лесно да се направи, отколкото звучи.
2. Работа с мишката
Двигателят на играта има два метода за работа с мишката:
void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)
Вие просто декларирате тези методи във вашия собствен клас, който наследява Game
класа. И след това напишете Howъвто искате code в тези методи. Двигателят на играта ще извика тези методи, когато потребителят щракне върху бутоните на мишката.
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() {
// Set the size of the playing field to 3x3
setScreenSize(3, 3);
// Paint the playing field white
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) {
// Put a "X" in the cell that was clicked with the left mouse button
setCellValue(x, y, "X");
}
@Override
public void onMouseRightClick(int x, int y) {
// Clear the cell that was clicked with the right mouse button
setCellValue(x, y, "");
}
}
В примера по-горе декларирахме и двата метода: onMouseLeftClick()
и onMouseRightClick()
. Първият метод ще бъде извикан, когато потребителят щракне с левия бутон на мишката върху клетките на игралното поле. Вторият метод ще бъде извикан при щракване с десния бутон на мишката.
Като аргументи двигателът на играта CodeGym ще предаде (x, y)
координатите на клетката на игралното поле, където е щракнато с мишката.
3. Работа с клавиатурата
Двигателят на играта има два метода за работа с клавиатурата:
void onKeyPress(Key key);
void onKeyReleased(Key key);
Ако искате да направите нещо, когато потребителят натисне клавиш, просто трябва да декларирате тези методи във вашия клас, който наследява класа Game
.
Вие пишете codeа си в тези методи и двигателът на играта ще ги извика, когато потребителят натисне (or пусне) клавиш.
onKeyPress(Key key)
се извиква при натискане на произволен клавиш . Стойността на натиснатия клавиш (or ) се предава на метода като параметър. За да използвате този метод, трябва да го замените, като поставите анотацията преди името на метода.Key.UNKNOWN
key
@Override
onKeyReleased(Key key)
се извиква при отпускане на произволен клавиш . Стойността на съответния ключ (or ) се присвоява на параметъра. За да използвате този метод, трябва да го замените, като поставите анотацията преди името на метода.Key.UNKNOWN
key
@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() {
// Set the size of the playing field to 3x3
setScreenSize(3, 3);
// Paint the playing field white
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) {
// When the spacebar is pressed, the center cell turns yellow
if (key == Key.SPACE) {
setCellColor(1, 1, Color.YELLOW);
}
}
@Override
public void onKeyReleased(Key key) {
// When the spacebar is released, the center cell returns to white
if (key == Key.SPACE) {
setCellColor(1, 1, Color.WHITE);
}
}
}
4. Списък на всички поддържани ключове
Когато двигателят на CodeGym извиква методите onKeyPress()
и onKeyReleased()
, той им предава информация за натиснатия (освободения) клавиш. За да направи това, двигателят CodeGym има специален тип, наречен Key
.
В текущата version на двигателя Key
типът поддържа само ограничен набор от 9 стойности:
Стойност | Какво е натиснал потребителят |
---|---|
|
Потребителят натисна клавиша Enter |
|
Потребителят натисна клавиша Esc |
|
Потребителят натисна клавиша за пауза |
|
Потребителят натисна клавиша за интервал |
|
Потребителят натисна клавиша със стрелка наляво |
|
Потребителят натисна клавиша със стрелка надясно |
|
Потребителят натисна клавиша със стрелка нагоре |
|
Потребителят натисна клавиша със стрелка надолу |
|
Всеки ключ, различен от изброените по-горе |
Ако играчът натисне интервала, тогава onKeyPress()
методът ще бъде извикан с Key.SPACE
параметър. Ако потребителят натисне лявата стрелка, тогава параметърът ще бъде Key.LEFT
. Ако потребителят натисне клавиш, който не е в списъка по-горе, тогава методът onKeyPress()
ще бъде извикан с Key.UNKNOWN
параметър.
Проблемът тук е, че съществуващите игри на CodeGym са проектирани да работят на телефон. Вместо стандартната клавиатура имаме 8 виртуални бутона:
5. Работа с таймер
Много игри се провеждат в реално време, т.е. потребителят може да не прави нищо, но определени събития все още се случват в играта. За да ви позволим да реализирате такива игри, ние добавихме таймер към двигателя на играта.
Ето How работи: пускате таймера и задавате времето, след което да се задейства. Например 500 ms. След това на всеки половин секунда двигателът на играта CodeGym ще извиква onTurn()
метода. Безкраен брой пъти — докато таймерът се изключи.
Как използвате таймер?
1. Включете таймера
За да включите таймера, имаме void setTurnTimer(int timeMs)
метода. Методът приема като аргумент продължителността (в мorсекунди or 1/1000 от секундата) на интервала между обратните извиквания. Просто трябва да извикате този метод веднъж и двигателът на играта ще започне да извиква метода onTurn()
на всеки timeMs
мorсекунди.
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() {
// Create a 3x3 playing field
setScreenSize(3, 3);
showGrid(false);
setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
}
@Override
public void onTurn(int step) {
if (step == 100) {
stopTurnTimer(); // If this is the 100th callback, then turn off the timer
}
if (step % 2 == 1) {
// If this is an odd calllback, then set the cell background to red
setCellColor(1, 1, Color.RED);
} else {
// If this is an even callback, then set the cell background to blue
setCellColor(1, 1, Color.BLUE);
}
}
...
}
В този прост пример създадохме поле, което е 3 клетки на 3 клетки. След това включихме таймер, който ще извиква onTurn()
метода на всеки половин секунда.
Тук цветът на централната клетка ще се променя на всеки половин секунда. Текстът на клетката няма да се промени. След 50 секунди (100 обратни повиквания) цветът ще спре да се променя и таймерът ще се изключи.