A CodeGym "Játékai" egy új rész nagy, érdekes feladatokkal, ahol létrehozhatod a népszerű játékok saját verzióit. Egyszerű: minden játékprojekt részfeladatokra van osztva. Töltse ki őket egyenként, és a játék kész. Megoszthatja a közösségi hálózatokon, és meghívhatja barátait játszani. A CodeGym „Játékok” szakasza: Eseménykezelés – 1Ebben a cikkben részletesen leírjuk a játékok írásához használt eseménykezelési módszereket.

1. Munka az egérrel

A játékmotor két módszerrel dolgozik az egérrel:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

Egyszerűen deklarálja ezeket a metódusokat az osztályában, amely örökli a -t Game, és tetszőleges kódot ad hozzájuk. A játékmotor hívja őket, amikor a felhasználó rákattint az egérgombokra.
  1. onMouseLeftClick(int x, int y)— hívja a motor, amikor a bal egérgombbal kattintanak. Paraméterei annak a játékmezőnek a koordinátái, ahol a kattintás történt. A bal felső cella koordinátái (0, 0). A használatához felül kell írnia ezt a módszert.

  2. onMouseRightClick(int x, int y)— hívja meg, ha a jobb egérgombbal kattint. Ez a módszer úgy működik, mint a onMouseLeftClick(int x, int y)módszer.

Íme egy példa a módszerek használatára:

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. A billentyűzet használata

A játékmotor két módszerrel dolgozik a billentyűzettel:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Ha azt szeretné, hogy valami történjen, amikor a felhasználó megnyom egy billentyűt, deklarálja ezeket a metódusokat az osztályában, amely örökli a Game-et, és adja hozzá a kódját. A játékmotor hívja őket, amikor a felhasználó megnyom vagy elenged egy billentyűt.
  1. onKeyPress(Key key)— bármelyik gomb megnyomásakor hívható. A kulcsparaméter a lenyomott gomb (vagy Key.UNKNOWN).

  2. onKeyReleased(Key key)— hívják, ha bármelyik billentyűt elengedik. A kulcsparaméter a megfelelő kulcs (vagy Key.UNKNOWN).

Íme egy példa a módszerek használatára:

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);
        }
    }
}
Fontos! A játékmotor jelenlegi verziójában a kulcstípus kilenc értékből álló korlátozott készlettel rendelkezik:
Érték A felhasználó által megnyomott billentyű
Key.ENTER A felhasználó megnyomta az Enter billentyűt
Kulcs.MENEKÜLÉS A felhasználó megnyomta az Esc billentyűt
Key.PAUSE A felhasználó megnyomta a Szünet gombot
Key.Space A felhasználó megnyomta a szóköz gombot
Kulcs.BAL A felhasználó megnyomta a bal nyílbillentyűt
Kulcs.JOBBRA A felhasználó megnyomta a jobbra mutató nyilat
Kulcs.FEL A felhasználó megnyomta a felfelé mutató nyilat
Kulcs.LE A felhasználó megnyomta a le gombot
Kulcs.ISMERETLEN A felhasználó a fentiektől eltérő gombot nyomott meg

3. Munka az időzítővel

Sok játék valós időben történik, vagyis ha a felhasználó nem csinál semmit, akkor is előfordulnak események a játékban. Az ilyen játékok megvalósításához időzítőt adtunk a játékmotorhoz. Valahogy így működik: bekapcsolod az időzítőt és beállítod az időzítő intervallumát. Például 500 ezredmásodperc. Ezután a játékmotor fél másodpercenként meghívja a onTurnTimer()metódust. Újra és újra örökre – amíg az időzítőt ki nem kapcsolják. Szóval hogyan kell használni az időzítőt?
  1. Kapcsolja be az időzítőt.

    Ehhez van egy speciális módszer. A metódus a hívások közötti intervallumot használja ezredmásodpercben (1 ezredmásodperc = 1/1000 másodperc). Csak egyszer kell meghívnia, és a játékmotor minden Ms ezredmásodpercben elkezdi hívni a metódust.void setTurnTimer(int timeMs)onTurn()

  2. Az onTurn(int) metódus felülbírálása.

    Ehhez deklarálnia kell egy metódust az osztályban, amely örökli a . Ezt a módszert a játékmotor hívja meg. Sőt, a játékmotor minden egyes hívással egy szekvenciális azonosítót ad a metódusnak a híváshoz (1, 2, 3, …).void onTurn(int step)Game

  3. Kapcsolja ki az időzítőt.

    Ha az időzítőre már nincs szükség, például amikor a felhasználó befejezi a játékot, akkor kikapcsolhatja. Ehhez egyszerűen meg kell hívnia a módszert.stopTurnTimer()

  4. Gyorsítsa fel vagy módosítsa az időzítőt.

    Egyes játékokban az események bekövetkezésének üteme folyamatosan gyorsul, ezért célszerű lenne felgyorsítani az időzítőnket (csökkenteni a hívások közötti időt). Mi sem lehet egyszerűbb: hívjon setTurnTimer(int timeMs)újra egy új értékkel, és onTurn()megváltozik a hívások közötti idő.

Például:

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

        }
    }
    …
}
Ebben az egyszerű példában létrehoztunk egy mezőt, amely 3 cella x 3 cella. Ezután elindítottunk egy időzítőt, amely onTurn()fél másodpercenként hívja meg a metódust. Fél másodpercenként változik a cella színe, de a tartalma nem. 50 másodperc elteltével a szín már nem változik. Ez minden most! Ha többet szeretne megtudni a "Játékok" részről, itt van néhány hasznos dokumentáció, amely segíthet: