1. Inleiding

Een game-engine zou weinig nut hebben als we die alleen konden gebruiken om iets op het scherm te tekenen. Om een ​​volwaardige game te schrijven, hebben we interactie met de gebruiker nodig! Om preciezer te zijn, ons programma zou gebruikersacties moeten volgen en erop moeten reageren.

Om dit te doen, heeft de CodeGym-game-engine speciale methoden die worden aangeroepen wanneer de gebruiker op de muisknoppen of toetsenbordtoetsen klikt.

Het punt van de klas is dat je deze methoden zelf schrijft, en dat de CodeGym-game-engine verantwoordelijk is voor het aanroepen ervan. Het enige dat u hoeft te doen, is deze methoden in uw code te declareren. Dit is gemakkelijker te doen dan het klinkt.


2. Werken met de muis

De game-engine heeft twee methoden om met de muis te werken:

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

U declareert deze methoden eenvoudig in uw eigen klasse die de Gameklasse erft. En schrijf vervolgens de gewenste code in deze methoden. De game-engine roept deze methoden aan wanneer de gebruiker op de muisknoppen klikt.

onMouseLeftClick(int x, int y)wordt aangeroepen door de engine wanneer met de linkermuisknop wordt geklikt. De parameters zijn de coördinaten van de cel van het speelveld waar de klik plaatsvond. De coördinaten van de cel linksboven zijn (0,0). Om deze methode te gebruiken, moet u deze overschrijven door de @Overrideannotatie voor de naam van de methode te plaatsen.

onMouseRightClick(int x, int y)wordt aangeroepen wanneer met de rechtermuisknop wordt geklikt. Het werkt vergelijkbaar met de onMouseLeftClick(int x, int y)methode.

Voorbeelden van het gebruik van deze methoden:

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

In het bovenstaande voorbeeld hebben we beide methoden gedeclareerd: onMouseLeftClick()en onMouseRightClick(). De eerste methode wordt aangeroepen wanneer de gebruiker met de linkermuisknop op cellen van het speelveld klikt. De tweede methode wordt aangeroepen wanneer met de rechtermuisknop wordt geklikt.

Als argumenten zal de CodeGym game engine de (x, y)coördinaten doorgeven van de cel van het speelveld waar met de muis is geklikt.



3. Werken met het toetsenbord

De game-engine heeft twee methoden om met het toetsenbord te werken:

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

Als je iets wilt doen wanneer de gebruiker op een toets drukt, hoef je alleen maar deze methoden te declareren in je klasse die de Gameklasse erft.

U schrijft uw code op deze manieren en de game-engine roept ze op wanneer de gebruiker een toets indrukt (of loslaat).

onKeyPress(Key key)wordt aangeroepen wanneer een willekeurige toets wordt ingedrukt . De waarde van de ingedrukte toets (of ) wordt als parameter aan de methode doorgegeven. Om deze methode te gebruiken, moet u deze overschrijven door de annotatie voor de naam van de methode te plaatsen.Key.UNKNOWNkey@Override

onKeyReleased(Key key)wordt aangeroepen wanneer een willekeurige toets wordt losgelaten . De waarde van de corresponderende sleutel (of ) wordt toegewezen aan de parameter. Om deze methode te gebruiken, moet u deze overschrijven door de annotatie voor de naam van de methode te plaatsen.Key.UNKNOWNkey@Override

Voorbeelden van het gebruik van deze methoden:

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. Lijst met alle ondersteunde toetsen

onKeyPress()Wanneer de CodeGym-engine de methoden en aanroept onKeyReleased(), geeft het informatie door over de ingedrukte (losgelaten) toets. Om dit te doen, heeft de CodeGym-engine een speciaal type genaamd Key.

In de huidige versie van de engine Keyondersteunt het type slechts een beperkte set van 9 waarden:

Waarde Wat de gebruiker heeft ingedrukt
Key.ENTER
De gebruiker heeft op Enter gedrukt
Key.ESCAPE
De gebruiker heeft op de Esc- toets gedrukt
Key.PAUSE
De gebruiker heeft op de pauzetoets gedrukt
Key.SPACE
De gebruiker heeft op de spatietoets gedrukt
Key.LEFT
De gebruiker heeft op de pijl-links gedrukt
Key.RIGHT
De gebruiker heeft op de pijl -rechts gedrukt
Key.UP
De gebruiker heeft op de pijl-omhoog- toets gedrukt
Key.DOWN
De gebruiker heeft op de toets Pijl-omlaag gedrukt
Key.UNKNOWN
Elke andere sleutel dan hierboven vermeld

Als de speler op de spatiebalk drukt, onKeyPress()wordt de methode aangeroepen met Key.SPACEals parameter. Als de gebruiker op de linkerpijl drukt, is de parameter Key.LEFT. Als de gebruiker op een toets drukt die niet in de bovenstaande lijst staat, onKeyPress()wordt de methode aangeroepen met Key.UNKNOWNals parameter.

Het probleem hier is dat de bestaande CodeGym-spellen zijn ontworpen om op een telefoon te worden uitgevoerd. In plaats van het standaard toetsenbord hebben we 8 virtuele knoppen:


5. Werken met een timer

Veel spellen spelen zich in realtime af, dwz de gebruiker kan niets doen, maar bepaalde gebeurtenissen vinden nog steeds plaats in het spel. Om u in staat te stellen dergelijke spellen te implementeren, hebben we een timer aan de game-engine toegevoegd.

Zo werkt het: u zet de timer aan en stelt de tijd in waarna deze moet worden geactiveerd. Bijvoorbeeld 500 ms. Vervolgens roept de CodeGym-game-engine elke halve seconde de onTurn()methode aan. Een oneindig aantal keren - totdat de timer wordt uitgeschakeld.

Hoe gebruik je een timer?

1. Schakel de timer in

Om de timer in te schakelen, hebben we de void setTurnTimer(int timeMs)methode. De methode neemt als argument de duur (in milliseconden of 1/1000s van een seconde) van het interval tussen callbacks. U hoeft deze methode maar één keer aan te roepen en de game-engine begint de onTurn()methode elke timeMsmilliseconde aan te roepen.

2. Negeer de onTurn(int)methode

Om dit te doen, moet u een void onTurn(int step)methode declareren in een klasse die de Gameklasse overerft. De game-engine roept deze methode aan. Bij elke aanroep geeft de engine een volgnummer door dat de methodeaanroep identificeert ( 1, 2, 3, ...).

3. Schakel de timer uit

Als de timer niet meer nodig is, bijvoorbeeld omdat de gebruiker het spel heeft beëindigd, dan kan deze worden uitgeschakeld. Om dit te doen, roept u gewoon de stopTurnTimer()methode aan.

4 Versnel/wijzig de timer

In sommige games neemt de frequentie van gebeurtenissen regelmatig toe, dus het zou handig zijn om onze timer te versnellen, dwz de tijd tussen callbacks te verkorten. En niets is eenvoudiger: bel gewoon setTurnTimer(int timeMs)opnieuw met de nieuwe waarde en de tijd tussen oproepen naar onTurn()zal veranderen.

Voorbeeld:

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

In dit eenvoudige voorbeeld hebben we een veld gemaakt van 3 cellen bij 3 cellen. Vervolgens hebben we een timer ingeschakeld die de methode elke halve seconde aanroept onTurn().

Hier verandert de kleur van de centrale cel elke halve seconde. De tekst van de cel verandert niet. Na 50 seconden (100 callbacks) verandert de kleur niet meer en wordt de timer uitgeschakeld.