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 @Override
merknaden 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.UNKNOWN
key
@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.UNKNOWN
key
@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 Key
støtter typen bare et begrenset sett med 9 verdier:
Verdi | Hva brukeren trykket på |
---|---|
|
Brukeren trykket på Enter - tasten |
|
Brukeren trykket på Esc- tasten |
|
Brukeren trykket på Pause- tasten |
|
Brukeren trykket på mellomromstasten |
|
Brukeren trykket på venstre piltast |
|
Brukeren trykket på høyre piltast |
|
Brukeren trykket på pil opp -tasten |
|
Brukeren trykket på pil ned- tasten |
|
Enhver annen nøkkel enn de som er oppført ovenfor |
Hvis spilleren trykker på mellomromstasten, onKeyPress()
vil metoden bli kalt med Key.SPACE
som 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.UNKNOWN
som 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 timeMs
millisekund.
2. Overstyr onTurn(int)
metoden
For å gjøre dette må du deklarere en void onTurn(int step)
metode i en klasse som arver Game
klassen. 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.