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.UNKNOWNkey@Override

onKeyReleased(Key key)се извиква при отпускане на произволен клавиш . Стойността на съответния ключ (or ) се присвоява на параметъра. За да използвате този метод, трябва да го замените, като поставите анотацията преди името на метода.Key.UNKNOWNkey@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 стойности:

Стойност Какво е натиснал потребителят
Key.ENTER
Потребителят натисна клавиша Enter
Key.ESCAPE
Потребителят натисна клавиша Esc
Key.PAUSE
Потребителят натисна клавиша за пауза
Key.SPACE
Потребителят натисна клавиша за интервал
Key.LEFT
Потребителят натисна клавиша със стрелка наляво
Key.RIGHT
Потребителят натисна клавиша със стрелка надясно
Key.UP
Потребителят натисна клавиша със стрелка нагоре
Key.DOWN
Потребителят натисна клавиша със стрелка надолу
Key.UNKNOWN
Всеки ключ, различен от изброените по-горе

Ако играчът натисне интервала, тогава 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 обратни повиквания) цветът ще спре да се променя и таймерът ще се изключи.