1. Introduksjon

En spillmotor ville vært til liten nytte hvis vi bare kunne bruke den til å tegne noe på skjermen. For å skrive et fullverdig spill, trenger vi det for å samhandle med brukeren! For å være mer presis bør programmet vårt spore brukerhandlinger og svare på dem.

For å gjøre dette har CodeGym-spillmotoren spesielle metoder som den kaller når brukeren klikker på museknappene eller tastaturtastene.

Poenget med timen er at du skriver disse metodene selv, og så er det CodeGym-spillmotoren som er ansvarlig for å kalle dem. Alt du trenger er å deklarere disse metodene i koden din. Dette er lettere å gjøre enn det høres ut som.


2. Arbeide med musen

Spillmotoren har to metoder for å jobbe med musen:

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

Du erklærer ganske enkelt disse metodene i din egen klasse som arver klassen Game. Og skriv deretter hvilken kode du vil ha i disse metodene. Spillmotoren vil kalle disse metodene når brukeren klikker på museknappene.

onMouseLeftClick(int x, int y)kalles opp av motoren når venstre museknapp klikkes. Parametrene er koordinatene til cellen på spillefeltet der klikket skjedde. Koordinatene til cellen øverst til venstre er (0,0). For å bruke denne metoden må du overstyre den ved å plassere @Overridemerknaden foran metodenavnet.

onMouseRightClick(int x, int y)kalles når høyre museknapp klikkes. Det fungerer på samme måte som onMouseLeftClick(int x, int y)metoden.

Eksempler på bruk av disse metodene:

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ærte vi begge metodene: onMouseLeftClick()og onMouseRightClick(). Den første metoden vil bli kalt når brukeren klikker venstre museknapp på cellene i spillefeltet. Den andre metoden vil bli kalt når høyre museknapp klikkes.

Som argumenter vil CodeGym-spillmotoren sende (x, y)koordinatene til cellen på spillefeltet der musen ble klikket.



3. Arbeide med tastaturet

Spillmotoren har to metoder for å jobbe med tastaturet:

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

Hvis du vil gjøre noe når brukeren trykker på en tast, trenger du bare å deklarere disse metodene i klassen din som arver klassen Game.

Du skriver koden din i disse metodene, og spillmotoren vil kalle dem når brukeren trykker (eller slipper) en tast.

onKeyPress(Key key)kalles opp når en tast trykkes . Verdien til den trykket tasten (eller ) overføres til metoden som parameter. For å bruke denne metoden må du overstyre den ved å plassere merknaden foran metodenavnet.Key.UNKNOWNkey@Override

onKeyReleased(Key key)kalles opp når en tast slippes . Verdien til den tilsvarende nøkkelen (eller ) blir tilordnet parameteren . For å bruke denne metoden må du overstyre den ved å plassere merknaden foran metodenavnet.Key.UNKNOWNkey@Override

Eksempler på bruk av disse metodene:

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 støttede nøkler

Når CodeGym-motoren kaller onKeyPress()og onKeyReleased()-metodene, sender den informasjon til dem om den trykket (frigitte) tasten. For å gjøre dette har CodeGym-motoren en spesiell type kalt Key.

I gjeldende versjon av motoren Keystøtter typen bare et begrenset sett med 9 verdier:

Verdi Hva brukeren trykket på
Key.ENTER
Brukeren trykket på Enter - tasten
Key.ESCAPE
Brukeren trykket på Esc- tasten
Key.PAUSE
Brukeren trykket på Pause- tasten
Key.SPACE
Brukeren trykket på mellomromstasten
Key.LEFT
Brukeren trykket på venstre piltast
Key.RIGHT
Brukeren trykket på høyre piltast
Key.UP
Brukeren trykket på pil opp -tasten
Key.DOWN
Brukeren trykket på pil ned- tasten
Key.UNKNOWN
Enhver annen nøkkel enn de som er oppført ovenfor

Hvis spilleren trykker på mellomromstasten, onKeyPress()vil metoden bli kalt med Key.SPACEsom parameter. Hvis brukeren trykker på venstre pil, vil parameteren være Key.LEFT. Hvis brukeren trykker på en tast som ikke er i listen ovenfor, onKeyPress()vil metoden bli kalt med Key.UNKNOWNsom parameter.

Problemet her er at de eksisterende CodeGym-spillene ble designet for å kjøre på en telefon. I stedet for standardtastaturet har vi 8 virtuelle knapper:


5. Arbeid med en timer

Mange spill finner sted i sanntid, det vil si at brukeren kanskje ikke gjør noe, men visse hendelser skjer fortsatt i spillet. For å la deg implementere slike spill, la vi til en tidtaker til spillmotoren.

Slik fungerer det: du slår på timeren og stiller inn tiden etter at den skal utløses. For eksempel, 500 ms. Deretter, hvert halve sekund, vil CodeGym-spillmotoren kalle opp onTurn()metoden. Et uendelig antall ganger — til tidtakeren slås av.

Hvordan bruker du en timer?

1. Slå på timeren

For å slå på timeren har vi void setTurnTimer(int timeMs)metoden. Metoden tar som argument varigheten (i millisekunder eller 1/1000s av et sekund) av intervallet mellom tilbakeringinger. Du trenger bare å kalle denne metoden én gang, og spillmotoren vil begynne å kalle metoden onTurn()hvert timeMsmillisekund.

2. Overstyr onTurn(int)metoden

For å gjøre dette må du deklarere en void onTurn(int step)metode i en klasse som arver Gameklassen. Spillmotoren vil kalle denne metoden. Med hvert anrop sender motoren et sekvensnummer som identifiserer metodeanropet ( 1, 2, 3, ...).

3. Slå av timeren

Hvis timeren ikke lenger er nødvendig, for eksempel fordi brukeren har fullført spillet, kan den slås av. For å gjøre dette, ring bare stopTurnTimer()metoden.

4 Akselerer/endre timeren

I noen spill øker frekvensen av hendelser jevnlig, så det vil være praktisk å kunne øke hastigheten på timeren vår, dvs. redusere tiden mellom tilbakeringinger. Og ingenting kan være enklere - bare ring setTurnTimer(int timeMs)igjen med den nye verdien, og tiden mellom samtalene til onTurn()vil endres.

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 enkle eksemplet laget vi et felt som er 3 celler ganger 3 celler. Så skrudde vi på en timer som vil kalle opp onTurn()metoden hvert halve sekund.

Her vil fargen på den sentrale cellen endres hvert halve sekund. Teksten i cellen vil ikke endres. Etter 50 sekunder (100 tilbakeringinger), vil fargen slutte å endre seg og tidtakeren slås av.