CodeGym /Java-blogg /Tilfeldig /Spillseksjonen på CodeGym: Begivenhetshåndtering
John Squirrels
Nivå
San Francisco

Spillseksjonen på CodeGym: Begivenhetshåndtering

Publisert i gruppen
«Spill» fra CodeGym er en ny seksjon med store interessante oppgaver hvor du lager dine egne versjoner av populære spill. Det er enkelt: hvert spillprosjekt er delt inn i deloppgaver. Fullfør dem en etter en og spillet er ferdig. Du kan dele den på sosiale nettverk og invitere vennene dine til å spille. "Spill"-delen på CodeGym: Begivenhetshåndtering - 1I denne artikkelen vil vi beskrive i detalj hendelseshåndteringsmetodene som brukes til å skrive spill.

1. 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 klassen din som arver Game, og legger til hvilken som helst kode du vil ha til dem. Spillmotoren vil kalle dem når brukeren klikker på museknappene.
  1. onMouseLeftClick(int x, int y)— kalles opp av motoren når venstre museknapp klikkes. Parametrene er koordinatene til cellen på spillefeltet der klikket skjedde. Den øverste venstre cellen har koordinater (0, 0). Du må overstyre denne metoden for å bruke den.

  2. onMouseRightClick(int x, int y)— kalles når høyre museknapp klikkes. Denne metoden fungerer som onMouseLeftClick(int x, int y)metoden.

Her er et eksempel 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) {
        // 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. Arbeide med tastaturet

Spillmotoren har to metoder for å jobbe med tastaturet:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

Hvis du vil at noe skal skje når brukeren trykker på en tast, erklærer du disse metodene i klassen din som arver spillet, og legg til koden din til dem. Spillmotoren vil ringe dem når brukeren trykker eller slipper en tast.
  1. onKeyPress(Key key)— ringes opp når en tast trykkes. Nøkkelparameteren er den trykket tasten (eller Key.UNKNOWN).

  2. onKeyReleased(Key key)— ringes opp når en tast slippes. Nøkkelparameteren er den tilsvarende nøkkelen (eller Key.UNKNOWN).

Her er et eksempel 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 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 gjeldende versjonen av spillmotoren har nøkkeltypen et begrenset sett med ni verdier:
Verdi Tast trykket av brukeren
Tast.ENTER Brukeren trykket på Enter
Key.ESCAPE Brukeren trykket Esc
Tast.PAUSE Brukeren trykket Pause
Key.SPACE Brukeren trykket mellomrom
Tast.VENSTRE Brukeren trykket på venstre piltast
Nøkkel.HØYRE Brukeren trykket på høyre piltast
Tast.OPP Brukeren trykket på pil opp-tasten
Tast.NED Brukeren trykket på ned-tasten
Nøkkel.UKJENT Brukeren trykket på en annen tast enn de ovenfor

3. Arbeide med timeren

Mange spill skjer i sanntid, det vil si at selv om brukeren ikke gjør noe, skjer det fortsatt hendelser i spillet. For å gjøre det mulig for deg å implementere slike spill, la vi til en tidtaker til spillmotoren. Det fungerer omtrent slik: du slår på timeren og stiller inn timerintervallet. For eksempel 500 millisekunder. Deretter kaller spillmotoren metoden hvert halve sekund onTurnTimer(). Igjen og igjen for alltid - helt til timeren er slått av. Så hvordan bruker du timeren?
  1. Slå på timeren.

    For å gjøre dette er det en spesiell void setTurnTimer(int timeMs)metode. Metoden tar som argument intervallet mellom anrop i millisekunder (1 millisekund = 1/1000 sekund). Du trenger bare å ringe den én gang, og spillmotoren vil begynne å kalle onTurn()metoden hver gang Ms millisekunder.

  2. Overstyr onTurn(int)-metoden.

    For å gjøre dette må du deklarere en void onTurn(int step)metode i klassen som arver Game. Denne metoden vil bli kalt av spillmotoren. Dessuten vil spillmotoren med hvert kall sende en sekvensiell identifikator for samtalen til metoden (1, 2, 3, …).

  3. Slå av timeren.

    Hvis timeren ikke lenger er nødvendig, for eksempel når brukeren fullfører spillet, kan du slå den av. For å gjøre dette, trenger du bare å ringe stopTurnTimer()metoden.

  4. Akselerer eller endre tidtakeren.

    I noen spill akselererer hendelsene konstant, så det ville være praktisk å øke hastigheten på tidtakeren vår (redusere tiden mellom samtaler). Ingenting kan være enklere: Ring setTurnTimer(int timeMs)igjen med en ny verdi, og tiden mellom onTurn()samtalene endres.

For eksempel:

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 dette enkle eksemplet laget vi et felt som er 3 celler x 3 celler. Deretter startet vi en timer som vil kalle opp onTurn()metoden hvert halve sekund. Hvert halve sekund vil cellefargen endres, men innholdet endres ikke. Etter 50 sekunder vil fargen ikke lenger endres. Det er alt for nå! Hvis du vil lære mer om "Spill"-delen, er her litt nyttig dokumentasjon som kan hjelpe:
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION