1. Introduktion
En spilmotor ville være til lidt nytte, hvis vi kun kunne bruge den til at tegne noget på skærmen. For at skrive et fuldgyldigt spil, har vi brug for det til at interagere med brugeren! For at være mere præcis bør vores program spore brugerhandlinger og reagere på dem.
For at gøre dette har CodeGym-spilmotoren specielle metoder, som den kalder, når brugeren klikker på museknapperne eller tastaturtasterne.
Pointen med klassen er, at du selv skriver disse metoder, og så er CodeGym-spilmotoren ansvarlig for at kalde dem. Alt du behøver er at erklære disse metoder i din kode. Dette er nemmere at gøre, end det lyder.
2. Arbejde med musen
Spilmotoren har to metoder til at arbejde med musen:
void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)
Du erklærer blot disse metoder i din egen klasse, der arver Game
klassen. Og skriv derefter hvilken kode du vil have i disse metoder. Spillemaskinen kalder disse metoder, når brugeren klikker på museknapperne.
onMouseLeftClick(int x, int y)
kaldes af motoren, når venstre museknap klikkes. Dens parametre er koordinaterne for cellen på spillefeltet, hvor klikket fandt sted. Koordinaterne for den øverste venstre celle er (0,0)
. For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen @Override
før metodenavnet.
onMouseRightClick(int x, int y)
kaldes, når der klikkes på højre museknap . Det virker på samme måde som onMouseLeftClick(int x, int y)
metoden.
Eksempler på brug af disse 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) {
// 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ærede vi begge metoder: onMouseLeftClick()
og onMouseRightClick()
. Den første metode kaldes, når brugeren klikker på venstre museknap på cellerne i spillefeltet. Den anden metode kaldes, når der klikkes på højre museknap.
Som argumenter vil CodeGym-spilmotoren videregive (x, y)
koordinaterne for cellen på spillefeltet, hvor musen blev klikket.
3. Arbejde med tastaturet
Spilmotoren har to metoder til at arbejde med tastaturet:
void onKeyPress(Key key);
void onKeyReleased(Key key);
Hvis du vil gøre noget, når brugeren trykker på en tast, skal du blot erklære disse metoder i din klasse, der arver klassen Game
.
Du skriver din kode i disse metoder, og spilmotoren vil kalde dem, når brugeren trykker (eller slipper) en tast.
onKeyPress(Key key)
kaldes, når der trykkes på en vilkårlig tast . Værdien af den trykkede tast (eller ) overføres til metoden som parameter. For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen før metodenavnet.Key.UNKNOWN
key
@Override
onKeyReleased(Key key)
kaldes, når en tast slippes . Værdien af den tilsvarende tast (eller ) tildeles parameteren . For at bruge denne metode skal du tilsidesætte den ved at placere annoteringen før metodenavnet.Key.UNKNOWN
key
@Override
Eksempler på brug af disse 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 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 understøttede nøgler
Når CodeGym-motoren kalder onKeyPress()
og onKeyReleased()
-metoderne, videregiver den information til dem om den trykket (frigivet) tast. For at gøre dette har CodeGym-motoren en speciel type kaldet Key
.
I den aktuelle version af motoren Key
understøtter typen kun et begrænset sæt af 9 værdier:
Værdi | Hvad brugeren trykkede på |
---|---|
|
Brugeren trykkede på Enter- tasten |
|
Brugeren trykkede på Esc- tasten |
|
Brugeren trykkede på Pause- tasten |
|
Brugeren trykkede på mellemrumstasten |
|
Brugeren trykkede på venstre piletast |
|
Brugeren trykkede på højre piletast |
|
Brugeren trykkede på pil op- tasten |
|
Brugeren trykkede på pil ned- tasten |
|
Enhver anden nøgle end dem, der er anført ovenfor |
Hvis spilleren trykker på mellemrumstasten, onKeyPress()
kaldes metoden med Key.SPACE
som parameter. Hvis brugeren trykker på venstre pil, vil parameteren være Key.LEFT
. Hvis brugeren trykker på en tast, der ikke er på listen ovenfor, onKeyPress()
vil metoden blive kaldt med Key.UNKNOWN
som parameter.
Problemet her er, at de eksisterende CodeGym-spil blev designet til at køre på en telefon. I stedet for standardtastaturet har vi 8 virtuelle knapper:
5. Arbejde med en timer
Mange spil foregår i realtid, dvs. brugeren gør måske ikke noget, men visse begivenheder forekommer stadig i spillet. For at give dig mulighed for at implementere sådanne spil har vi tilføjet en timer til spilmotoren.
Sådan fungerer det: Du tænder for timeren og indstiller den tid, hvorefter den skal udløses. For eksempel, 500 ms. Derefter, hvert halve sekund, vil CodeGym-spilmotoren kalde onTurn()
metoden. Et uendeligt antal gange — indtil timeren slukkes.
Hvordan bruger du en timer?
1. Tænd for timeren
For at tænde timeren har vi void setTurnTimer(int timeMs)
metoden. Metoden tager som argument varigheden (i millisekunder eller 1/1000s af et sekund) af intervallet mellem tilbagekald. Du skal blot kalde denne metode én gang, og spilmotoren vil begynde at kalde metoden onTurn()
hvert timeMs
millisekund.
2. Tilsidesæt onTurn(int)
metoden
For at gøre dette skal du erklære en void onTurn(int step)
metode i en klasse, der arver Game
klassen. Spilmotoren vil kalde denne metode. Med hvert opkald sender motoren et sekventielt nummer, der identificerer metodekaldet ( 1
, 2
, 3
, ...).
3. Sluk timeren
Hvis timeren ikke længere er nødvendig, for eksempel fordi brugeren har afsluttet spillet, så kan den slås fra. For at gøre dette skal du blot kalde stopTurnTimer()
metoden.
4 Accelerér/skift timeren
I nogle spil stiger hyppigheden af begivenheder jævnligt, så det ville være praktisk at kunne fremskynde vores timer, altså reducere tiden mellem tilbagekald. Og intet kunne være nemmere - bare ring setTurnTimer(int timeMs)
igen med den nye værdi, og tiden mellem opkald til onTurn()
vil ændre sig.
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 simple eksempel oprettede vi et felt, der er 3 celler gange 3 celler. Så tændte vi en timer, der kalder onTurn()
metoden hvert halve sekund.
Her vil farven på den centrale celle skifte hvert halve sekund. Teksten i cellen ændres ikke. Efter 50 sekunder (100 tilbagekald), stopper farven med at skifte, og timeren slukker.
GO TO FULL VERSION