1. Introduktion

En spilmotor ville være til lidt nytte, hvis vi kun kunne bruge den til at tegne noget på skærmen. For at skrive et fuldgyldigt spil, har vi brug for det til at interagere med brugeren! For at være mere præcis bør vores program spore brugerhandlinger og reagere på dem.

For at gøre dette har CodeGym-spilmotoren specielle metoder, som den kalder, når brugeren klikker på museknapperne eller tastaturtasterne.

Pointen med klassen er, at du selv skriver disse metoder, og så er CodeGym-spilmotoren ansvarlig for at kalde dem. Alt du behøver er at erklære disse metoder i din kode. Dette er nemmere at gøre, end det lyder.


2. Arbejde med musen

Spilmotoren har to metoder til at arbejde med musen:

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

Du erklærer blot disse metoder i din egen klasse, der arver Gameklassen. Og skriv derefter hvilken kode du vil have i disse metoder. Spillemaskinen kalder disse metoder, når brugeren klikker på museknapperne.

onMouseLeftClick(int x, int y)kaldes af motoren, når venstre museknap klikkes. Dens parametre er koordinaterne for cellen på spillefeltet, hvor klikket fandt sted. Koordinaterne for den øverste venstre celle er (0,0). For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen @Overridefør metodenavnet.

onMouseRightClick(int x, int y)kaldes, når der klikkes på højre museknap . Det virker på samme måde som onMouseLeftClick(int x, int y)metoden.

Eksempler på brug af disse metoder:

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

I eksemplet ovenfor erklærede vi begge metoder: onMouseLeftClick()og onMouseRightClick(). Den første metode kaldes, når brugeren klikker på venstre museknap på cellerne i spillefeltet. Den anden metode kaldes, når der klikkes på højre museknap.

Som argumenter vil CodeGym-spilmotoren videregive (x, y)koordinaterne for cellen på spillefeltet, hvor musen blev klikket.



3. Arbejde med tastaturet

Spilmotoren har to metoder til at arbejde med tastaturet:

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

Hvis du vil gøre noget, når brugeren trykker på en tast, skal du blot erklære disse metoder i din klasse, der arver klassen Game.

Du skriver din kode i disse metoder, og spilmotoren vil kalde dem, når brugeren trykker (eller slipper) en tast.

onKeyPress(Key key)kaldes, når der trykkes på en vilkårlig tast . Værdien af ​​den trykkede tast (eller ) overføres til metoden som parameter. For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen før metodenavnet.Key.UNKNOWNkey@Override

onKeyReleased(Key key)kaldes, når en tast slippes . Værdien af ​​den tilsvarende tast (eller ) tildeles parameteren . For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen før metodenavnet.Key.UNKNOWNkey@Override

Eksempler på brug af disse metoder:

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. Liste over alle understøttede nøgler

Når CodeGym-motoren kalder onKeyPress()og onKeyReleased()-metoderne, videregiver den information til dem om den trykket (frigivet) tast. For at gøre dette har CodeGym-motoren en speciel type kaldet Key.

I den aktuelle version af motoren Keyunderstøtter typen kun et begrænset sæt af 9 værdier:

Værdi Hvad brugeren trykkede på
Key.ENTER
Brugeren trykkede på Enter- tasten
Key.ESCAPE
Brugeren trykkede på Esc- tasten
Key.PAUSE
Brugeren trykkede på Pause- tasten
Key.SPACE
Brugeren trykkede på mellemrumstasten
Key.LEFT
Brugeren trykkede på venstre piletast
Key.RIGHT
Brugeren trykkede på højre piletast
Key.UP
Brugeren trykkede på pil op- tasten
Key.DOWN
Brugeren trykkede på pil ned- tasten
Key.UNKNOWN
Enhver anden nøgle end dem, der er anført ovenfor

Hvis spilleren trykker på mellemrumstasten, onKeyPress()kaldes metoden med Key.SPACEsom parameter. Hvis brugeren trykker på venstre pil, vil parameteren være Key.LEFT. Hvis brugeren trykker på en tast, der ikke er på listen ovenfor, onKeyPress()vil metoden blive kaldt med Key.UNKNOWNsom parameter.

Problemet her er, at de eksisterende CodeGym-spil blev designet til at køre på en telefon. I stedet for standardtastaturet har vi 8 virtuelle knapper:


5. Arbejde med en timer

Mange spil foregår i realtid, dvs. brugeren gør måske ikke noget, men visse begivenheder forekommer stadig i spillet. For at give dig mulighed for at implementere sådanne spil har vi tilføjet en timer til spilmotoren.

Sådan fungerer det: Du tænder for timeren og indstiller den tid, hvorefter den skal udløses. For eksempel, 500 ms. Derefter, hvert halve sekund, vil CodeGym-spilmotoren kalde onTurn()metoden. Et uendeligt antal gange — indtil timeren slukkes.

Hvordan bruger du en timer?

1. Tænd for timeren

For at tænde timeren har vi void setTurnTimer(int timeMs)metoden. Metoden tager som argument varigheden (i millisekunder eller 1/1000s af et sekund) af intervallet mellem tilbagekald. Du skal blot kalde denne metode én gang, og spilmotoren vil begynde at kalde metoden onTurn()hvert timeMsmillisekund.

2. Tilsidesæt onTurn(int)metoden

For at gøre dette skal du erklære en void onTurn(int step)metode i en klasse, der arver Gameklassen. Spilmotoren vil kalde denne metode. Med hvert opkald sender motoren et sekventielt nummer, der identificerer metodekaldet ( 1, 2, 3, ...).

3. Sluk timeren

Hvis timeren ikke længere er nødvendig, for eksempel fordi brugeren har afsluttet spillet, så kan den slås fra. For at gøre dette skal du blot kalde stopTurnTimer()metoden.

4 Accelerér/skift timeren

I nogle spil stiger hyppigheden af ​​begivenheder jævnligt, så det ville være praktisk at kunne fremskynde vores timer, altså reducere tiden mellem tilbagekald. Og intet kunne være nemmere - bare ring setTurnTimer(int timeMs)igen med den nye værdi, og tiden mellem opkald til onTurn()vil ændre sig.

Eksempel:

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

I dette simple eksempel oprettede vi et felt, der er 3 celler gange 3 celler. Så tændte vi en timer, der kalder onTurn()metoden hvert halve sekund.

Her vil farven på den centrale celle skifte hvert halve sekund. Teksten i cellen ændres ikke. Efter 50 sekunder (100 tilbagekald), stopper farven med at skifte, og timeren slukker.