1. Wstęp

Silnik gry byłby mało przydatny, gdybyśmy mogli go używać tylko do rysowania czegoś na ekranie. Aby napisać pełnoprawną grę, potrzebujemy interakcji z użytkownikiem! Mówiąc dokładniej, nasz program powinien śledzić działania użytkownika i na nie reagować.

Aby to zrobić, silnik gry CodeGym ma specjalne metody, które wywołuje, gdy użytkownik klika przyciski myszy lub klawisze klawiatury.

Istotą zajęć jest to, że sam piszesz te metody, a następnie silnik gry CodeGym jest odpowiedzialny za ich wywołanie. Wszystko, czego potrzebujesz, to zadeklarować te metody w swoim kodzie. Jest to łatwiejsze niż się wydaje.


2. Praca z myszką

Silnik gry ma dwie metody pracy z myszką:

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

Po prostu deklarujesz te metody we własnej klasie, która dziedziczy Gameklasę. A następnie napisz dowolny kod w tych metodach. Silnik gry wywoła te metody, gdy użytkownik kliknie przyciski myszy.

onMouseLeftClick(int x, int y)jest wywoływana przez silnik po kliknięciu lewym przyciskiem myszy . Jego parametrami są współrzędne komórki pola gry, w której nastąpiło kliknięcie. Współrzędne górnej lewej komórki to (0,0). Aby skorzystać z tej metody, należy ją przesłonić, umieszczając adnotację @Overrideprzed nazwą metody.

onMouseRightClick(int x, int y)jest wywoływana po kliknięciu prawym przyciskiem myszy . Działa podobnie do onMouseLeftClick(int x, int y)metody.

Przykłady wykorzystania tych metod:

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

W powyższym przykładzie zadeklarowaliśmy obie metody: onMouseLeftClick()i onMouseRightClick(). Pierwsza metoda zostanie wywołana, gdy użytkownik kliknie lewym przyciskiem myszy komórki pola gry. Druga metoda zostanie wywołana po kliknięciu prawym przyciskiem myszy.

Jako argumenty silnik gry CodeGym przekaże (x, y)współrzędne komórki pola gry, w której kliknięto myszką.



3. Praca z klawiaturą

Silnik gry ma dwie metody pracy z klawiaturą:

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

Jeśli chcesz coś zrobić, gdy użytkownik naciśnie klawisz, wystarczy zadeklarować te metody w swojej klasie, która dziedziczy tę Gameklasę.

Piszesz swój kod za pomocą tych metod, a silnik gry wywoła je, gdy użytkownik naciśnie (lub zwolni) klawisz.

onKeyPress(Key key)jest wywoływana po naciśnięciu dowolnego klawisza . Wartość wciśniętego klawisza (lub ) jest przekazywana do metody jako parametr. Aby skorzystać z tej metody, należy ją przesłonić, umieszczając adnotację przed nazwą metody.Key.UNKNOWNkey@Override

onKeyReleased(Key key)jest wywoływana po zwolnieniu dowolnego klawisza . Wartość odpowiedniego klucza (lub ) zostaje przypisana do parametru. Aby skorzystać z tej metody, należy ją przesłonić, umieszczając adnotację przed nazwą metody.Key.UNKNOWNkey@Override

Przykłady wykorzystania tych metod:

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. Lista wszystkich obsługiwanych kluczy

Kiedy silnik CodeGym wywołuje metody onKeyPress()i onKeyReleased(), przekazuje im informację o naciśniętym (zwolnionym) klawiszu. Aby to zrobić, silnik CodeGym ma specjalny typ o nazwie Key.

W obecnej wersji silnika Keytyp obsługuje tylko ograniczony zestaw 9 wartości:

Wartość Co użytkownik nacisnął
Key.ENTER
Użytkownik nacisnął klawisz Enter
Key.ESCAPE
Użytkownik nacisnął klawisz Esc
Key.PAUSE
Użytkownik nacisnął klawisz pauzy
Key.SPACE
Użytkownik nacisnął klawisz spacji
Key.LEFT
Użytkownik nacisnął klawisz strzałki w lewo
Key.RIGHT
Użytkownik nacisnął klawisz strzałki w prawo
Key.UP
Użytkownik nacisnął klawisz strzałki w górę
Key.DOWN
Użytkownik nacisnął klawisz strzałki w dół
Key.UNKNOWN
Dowolny klucz inny niż wymienione powyżej

Jeśli gracz naciśnie spację, metoda onKeyPress()zostanie wywołana z Key.SPACEparametrem. Jeśli użytkownik naciśnie strzałkę w lewo, wówczas parametr będzie miał wartość Key.LEFT. Jeśli użytkownik naciśnie dowolny klawisz, którego nie ma na powyższej liście, wówczas metoda onKeyPress()zostanie wywołana z Key.UNKNOWNparametrem.

Problem polega na tym, że istniejące gry CodeGym zostały zaprojektowane do działania na telefonie. Zamiast standardowej klawiatury mamy 8 wirtualnych przycisków:


5. Praca z timerem

Wiele gier odbywa się w czasie rzeczywistym, tzn. użytkownik może nic nie robić, ale pewne zdarzenia nadal mają miejsce w grze. Aby umożliwić Ci wdrożenie takich gier, dodaliśmy licznik czasu do silnika gry.

Oto jak to działa: włączasz timer i ustawiasz czas, po którym powinien zostać uruchomiony. Na przykład 500 ms. Następnie co pół sekundy silnik gry CodeGym będzie wywoływał onTurn()metodę. Nieskończoną ilość razy — aż do wyłączenia timera.

Jak korzystać z timera?

1. Włącz minutnik

Aby włączyć timer, mamy void setTurnTimer(int timeMs)metodę. Metoda przyjmuje jako argument czas trwania (w milisekundach lub 1/1000 sekundy) interwału między wywołaniami zwrotnymi. Wystarczy raz wywołać tę metodę, a silnik gry zacznie ją wywoływać onTurn()co timeMsmilisekundy.

2. Zastąp onTurn(int)metodę

Aby to zrobić, musisz zadeklarować void onTurn(int step)metodę w klasie, która dziedziczy Gameklasę. Silnik gry wywoła tę metodę. Przy każdym wywołaniu silnik przekazuje kolejny numer, który identyfikuje wywołanie metody ( 1, 2, 3, ...).

3. Wyłącz minutnik

Jeśli timer nie jest już potrzebny, na przykład dlatego, że użytkownik zakończył grę, można go wyłączyć. Aby to zrobić, po prostu wywołaj stopTurnTimer()metodę.

4 Przyspiesz/zmień stoper

W niektórych grach częstotliwość zdarzeń wzrasta regularnie, więc wygodnie byłoby mieć możliwość przyspieszenia naszego timera, czyli skrócenia czasu między wywołaniami zwrotnymi. I nic prostszego — po prostu zadzwoń setTurnTimer(int timeMs)ponownie z nową wartością, a czas między połączeniami do onTurn()zmieni się.

Przykład:

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

W tym prostym przykładzie utworzyliśmy pole o wymiarach 3 komórki na 3 komórki. Następnie włączyliśmy timer, który będzie wywoływał onTurn()metodę co pół sekundy.

Tutaj kolor centralnej komórki będzie się zmieniał co pół sekundy. Tekst komórki nie ulegnie zmianie. Po 50 sekundach (100 wywołań zwrotnych) kolor przestanie się zmieniać, a timer się wyłączy.