"Games" van CodeGym is een nieuwe sectie met grote interessante taken waarin je je eigen versies van populaire games kunt maken. Het is eenvoudig: elk spelproject is onderverdeeld in subtaken. Voltooi ze een voor een en het spel is gedaan. Je kunt het delen op sociale netwerken en je vrienden uitnodigen om te spelen. Sectie "Games" op CodeGym: Afhandeling van gebeurtenissen - 1In dit artikel beschrijven we in detail de methoden voor het afhandelen van gebeurtenissen die worden gebruikt om games te schrijven.

1. 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 klasse die overerft Gameen voegt er elke gewenste code aan toe. De game-engine roept ze op wanneer de gebruiker op muisknoppen klikt.
  1. onMouseLeftClick(int x, int y)- aangeroepen door de motor wanneer op de linkermuisknop wordt geklikt. De parameters zijn de coördinaten van de cel van het speelveld waar de klik plaatsvond. De cel linksboven heeft coördinaten (0, 0). U moet deze methode overschrijven om deze te gebruiken.

  2. onMouseRightClick(int x, int y)- aangeroepen wanneer met de rechtermuisknop wordt geklikt. Deze methode werkt zoals de onMouseLeftClick(int x, int y)methode.

Hier is een voorbeeld 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) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. 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 wilt dat er iets gebeurt wanneer de gebruiker op een toets drukt, declareer dan deze methoden in je klasse die Game erft, en voeg je code eraan toe. De game-engine roept ze op wanneer de gebruiker een toets indrukt of loslaat.
  1. onKeyPress(Key key)— opgeroepen wanneer een willekeurige toets wordt ingedrukt. De sleutelparameter is de ingedrukte toets (of Key.UNKNOWN).

  2. onKeyReleased(Key key)- aangeroepen wanneer een toets wordt losgelaten. De sleutelparameter is de corresponderende sleutel (of Key.UNKNOWN).

Hier is een voorbeeld 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 space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
Belangrijk! In de huidige versie van de game-engine heeft het sleuteltype een beperkte set van negen waarden:
Waarde Toets ingedrukt door de gebruiker
Sleutel.ENTER De gebruiker drukte op Enter
Sleutel.ESCAPE De gebruiker heeft op Esc gedrukt
Toets.PAUSE De gebruiker heeft op Pauze gedrukt
Sleutel.RUIMTE De gebruiker drukte op Spatie
Sleutel.LINKS De gebruiker drukte op de linkerpijltoets
Sleutel.RECHTS De gebruiker drukte op de rechterpijltoets
Sleutel.UP De gebruiker drukte op de pijl-omhoog-toets
Toets neer De gebruiker drukte op de neer-toets
Sleutel.ONBEKEND De gebruiker heeft op een andere toets gedrukt dan de bovenstaande

3. Werken met de timer

Veel spellen vinden in realtime plaats, dwz zelfs als de gebruiker niets doet, vinden er nog steeds gebeurtenissen plaats in het spel. Om u in staat te stellen dergelijke spellen te implementeren, hebben we een timer aan de game-engine toegevoegd. Het werkt ongeveer zo: je zet de timer aan en stelt het timerinterval in. Bijvoorbeeld 500 milliseconden. Vervolgens roept de game-engine elke halve seconde de onTurnTimer()methode aan. Keer op keer voor altijd - totdat de timer wordt uitgeschakeld. Dus hoe gebruik je de timer?
  1. Schakel de timer in.

    Om dit te doen, is er een speciale methode. De methode neemt als argument het interval tussen oproepen in milliseconden (1 milliseconde = 1/1000 seconde). Je hoeft het maar één keer aan te roepen en de game-engine begint de methode elke milliseconde aan te roepen.void setTurnTimer(int timeMs)onTurn()

  2. Negeer de onTurn(int) methode.

    Om dit te doen, moet u een methode declareren in de klasse die overerft . Deze methode wordt aangeroepen door de game-engine. Bovendien geeft de game-engine bij elke oproep een sequentiële identificatie voor de oproep door aan de methode (1, 2, 3, …).void onTurn(int step)Game

  3. Schakel de timer uit.

    Als de timer niet meer nodig is, bijvoorbeeld wanneer de gebruiker het spel voltooit, kun je deze uitschakelen. Om dit te doen, hoeft u alleen maar de methode aan te roepen.stopTurnTimer()

  4. Versnel of verander de timer.

    In sommige games neemt de snelheid waarmee gebeurtenissen plaatsvinden voortdurend toe, dus het zou handig zijn om onze timer te versnellen (de tijd tussen oproepen verkorten). Niets is eenvoudiger: bel setTurnTimer(int timeMs)opnieuw met een nieuwe waarde en de tijd tussen onTurn()oproepen verandert.

Bijvoorbeeld:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
In dit eenvoudige voorbeeld hebben we een veld gemaakt van 3 cellen x 3 cellen. Daarna hebben we een timer gestart die de onTurn()methode elke halve seconde zal aanroepen. Elke halve seconde verandert de kleur van de cel, maar de inhoud verandert niet. Na 50 seconden verandert de kleur niet meer. Dat is het voor nu! Als u meer wilt weten over het gedeelte "Games", vindt u hier wat nuttige documentatie die kan helpen: