CodeGym /Java blogg /Slumpmässig /Spelsektion på CodeGym: Eventhantering
John Squirrels
Nivå
San Francisco

Spelsektion på CodeGym: Eventhantering

Publicerad i gruppen
"Spel" från CodeGym är en ny sektion med stora intressanta uppgifter där du skapar dina egna versioner av populära spel. Det är enkelt: varje spelprojekt är uppdelat i deluppgifter. Slutför dem en efter en och spelet är klart. Du kan dela det på sociala nätverk och bjuda in dina vänner att spela. Avsnittet "Spel" på CodeGym: Eventhantering - 1I den här artikeln kommer vi att beskriva i detalj händelsehanteringsmetoderna som används för att skriva spel.

1. Arbeta med musen

Spelmotorn har två metoder för att arbeta med musen:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

Du deklarerar helt enkelt dessa metoder i din klass som ärver , Gameoch lägger till vilken kod du vill ha till dem. Spelmotorn anropar dem när användaren klickar på musknapparna.
  1. onMouseLeftClick(int x, int y)— anropas av motorn när vänster musknapp klickas. Dess parametrar är koordinaterna för cellen på spelplanen där klicket inträffade. Den övre vänstra cellen har koordinater (0, 0). Du måste åsidosätta den här metoden för att använda den.

  2. onMouseRightClick(int x, int y)— anropas när du klickar på höger musknapp. Denna metod fungerar som onMouseLeftClick(int x, int y)metoden.

Här är ett exempel på hur du använder dessa 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) {
        // 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. Arbeta med tangentbordet

Spelmotorn har två metoder för att arbeta med tangentbordet:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Om du vill att något ska hända när användaren trycker på en tangent, deklarera dessa metoder i din klass som ärver Game, och lägg till din kod till dem. Spelmotorn anropar dem när användaren trycker eller släpper en tangent.
  1. onKeyPress(Key key)— anropas när någon knapp trycks ned. Nyckelparametern är den nedtryckta knappen (eller Key.OKNOWN).

  2. onKeyReleased(Key key)— anropas när någon tangent släpps. Nyckelparametern är motsvarande nyckel (eller Key.UNKNOWN).

Här är ett exempel på hur du använder dessa 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 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);
        }
    }
}
Viktig! I den nuvarande versionen av spelmotorn har nyckeltypen en begränsad uppsättning av nio värden:
Värde Tangent nedtryckt av användaren
Knapp.ENTER Användaren tryckte på Enter
Key.ESCAPE Användaren tryckte på Esc
Knapp.PAUS Användaren tryckte på Paus
Key.SPACE Användaren tryckte på mellanslag
Tangent.VÄNSTER Användaren tryckte på vänsterpilen
Nyckel.HÖGER Användaren tryckte på högerpilen
Key.UP Användaren tryckte på uppåtpilen
Nyckel ner Användaren tryckte på ned-knappen
Nyckel.OKÄND Användaren tryckte på en annan tangent än de ovan

3. Arbeta med timern

Många spel sker i realtid, det vill säga även om användaren inte gör något så inträffar fortfarande händelser i spelet. För att du ska kunna implementera sådana spel har vi lagt till en timer i spelmotorn. Det fungerar ungefär så här: du sätter på timern och ställer in timerintervallet. Till exempel 500 millisekunder. Sedan, varje halv sekund, anropar spelmotorn onTurnTimer()metoden. Om och om igen för alltid — tills timern stängs av. Så hur använder du timern?
  1. Slå på timern.

    För att göra detta finns det en speciell metod. Metoden tar som argument intervallet mellan anrop i millisekunder (1 millisekund = 1/1000 sekund). Du behöver bara anropa den en gång, och spelmotorn kommer att börja anropa metoden varje gång på millisekunder.void setTurnTimer(int timeMs)onTurn()

  2. Åsidosätt onTurn(int)-metoden.

    För att göra detta måste du deklarera en metod i klassen som ärver . Denna metod kommer att anropas av spelmotorn. Dessutom kommer spelmotorn för varje anrop att skicka en sekventiell identifierare för anropet till metoden (1, 2, 3, …).void onTurn(int step)Game

  3. Stäng av timern.

    Om timern inte längre behövs, till exempel när användaren slutför spelet, kan du stänga av den. För att göra detta behöver du bara anropa metoden.stopTurnTimer()

  4. Accelerera eller ändra timern.

    I vissa spel ökar takten med vilken händelser inträffar ständigt, så det skulle vara bekvämt att snabba upp vår timer (minska tiden mellan samtal). Inget kan vara enklare: ring en gång till med ett nytt värde, så ändras setTurnTimer(int timeMs)tiden mellan samtalen.onTurn()

Till exempel:

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

        }
    }
    …
}
I detta enkla exempel skapade vi ett fält som är 3 celler x 3 celler. Sedan startade vi en timer som kommer att anropa onTurn()metoden varje halv sekund. Varje halv sekund kommer cellfärgen att ändras, men dess innehåll ändras inte. Efter 50 sekunder kommer färgen inte längre att ändras. Det var allt tills vidare! Om du vill lära dig mer om avsnittet "Spel", här är lite användbar dokumentation som kan hjälpa:
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION