1. Inleiding
Een game-engine zou weinig nut hebben als we die alleen konden gebruiken om iets op het scherm te tekenen. Om een volwaardige game te schrijven, hebben we interactie met de gebruiker nodig! Om preciezer te zijn, ons programma zou gebruikersacties moeten volgen en erop moeten reageren.
Om dit te doen, heeft de CodeGym-game-engine speciale methoden die worden aangeroepen wanneer de gebruiker op de muisknoppen of toetsenbordtoetsen klikt.
Het punt van de klas is dat je deze methoden zelf schrijft, en dat de CodeGym-game-engine verantwoordelijk is voor het aanroepen ervan. Het enige dat u hoeft te doen, is deze methoden in uw code te declareren. Dit is gemakkelijker te doen dan het klinkt.
2. Werken met de muis
De game-engine heeft twee methoden om met de muis te werken:
void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)
U declareert deze methoden eenvoudig in uw eigen klasse die de Game
klasse erft. En schrijf vervolgens de gewenste code in deze methoden. De game-engine roept deze methoden aan wanneer de gebruiker op de muisknoppen klikt.
onMouseLeftClick(int x, int y)
wordt aangeroepen door de engine wanneer met de linkermuisknop wordt geklikt. De parameters zijn de coördinaten van de cel van het speelveld waar de klik plaatsvond. De coördinaten van de cel linksboven zijn (0,0)
. Om deze methode te gebruiken, moet u deze overschrijven door de @Override
annotatie voor de naam van de methode te plaatsen.
onMouseRightClick(int x, int y)
wordt aangeroepen wanneer met de rechtermuisknop wordt geklikt. Het werkt vergelijkbaar met de onMouseLeftClick(int x, int y)
methode.
Voorbeelden van het gebruik van deze methoden:
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, "");
}
}
In het bovenstaande voorbeeld hebben we beide methoden gedeclareerd: onMouseLeftClick()
en onMouseRightClick()
. De eerste methode wordt aangeroepen wanneer de gebruiker met de linkermuisknop op cellen van het speelveld klikt. De tweede methode wordt aangeroepen wanneer met de rechtermuisknop wordt geklikt.
Als argumenten zal de CodeGym game engine de (x, y)
coördinaten doorgeven van de cel van het speelveld waar met de muis is geklikt.
3. Werken met het toetsenbord
De game-engine heeft twee methoden om met het toetsenbord te werken:
void onKeyPress(Key key);
void onKeyReleased(Key key);
Als je iets wilt doen wanneer de gebruiker op een toets drukt, hoef je alleen maar deze methoden te declareren in je klasse die de Game
klasse erft.
U schrijft uw code op deze manieren en de game-engine roept ze op wanneer de gebruiker een toets indrukt (of loslaat).
onKeyPress(Key key)
wordt aangeroepen wanneer een willekeurige toets wordt ingedrukt . De waarde van de ingedrukte toets (of ) wordt als parameter aan de methode doorgegeven. Om deze methode te gebruiken, moet u deze overschrijven door de annotatie voor de naam van de methode te plaatsen.Key.UNKNOWN
key
@Override
onKeyReleased(Key key)
wordt aangeroepen wanneer een willekeurige toets wordt losgelaten . De waarde van de corresponderende sleutel (of ) wordt toegewezen aan de parameter. Om deze methode te gebruiken, moet u deze overschrijven door de annotatie voor de naam van de methode te plaatsen.Key.UNKNOWN
key
@Override
Voorbeelden van het gebruik van deze methoden:
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. Lijst met alle ondersteunde toetsen
onKeyPress()
Wanneer de CodeGym-engine de methoden en aanroept onKeyReleased()
, geeft het informatie door over de ingedrukte (losgelaten) toets. Om dit te doen, heeft de CodeGym-engine een speciaal type genaamd Key
.
In de huidige versie van de engine Key
ondersteunt het type slechts een beperkte set van 9 waarden:
Waarde | Wat de gebruiker heeft ingedrukt |
---|---|
|
De gebruiker heeft op Enter gedrukt |
|
De gebruiker heeft op de Esc- toets gedrukt |
|
De gebruiker heeft op de pauzetoets gedrukt |
|
De gebruiker heeft op de spatietoets gedrukt |
|
De gebruiker heeft op de pijl-links gedrukt |
|
De gebruiker heeft op de pijl -rechts gedrukt |
|
De gebruiker heeft op de pijl-omhoog- toets gedrukt |
|
De gebruiker heeft op de toets Pijl-omlaag gedrukt |
|
Elke andere sleutel dan hierboven vermeld |
Als de speler op de spatiebalk drukt, onKeyPress()
wordt de methode aangeroepen met Key.SPACE
als parameter. Als de gebruiker op de linkerpijl drukt, is de parameter Key.LEFT
. Als de gebruiker op een toets drukt die niet in de bovenstaande lijst staat, onKeyPress()
wordt de methode aangeroepen met Key.UNKNOWN
als parameter.
Het probleem hier is dat de bestaande CodeGym-spellen zijn ontworpen om op een telefoon te worden uitgevoerd. In plaats van het standaard toetsenbord hebben we 8 virtuele knoppen:
5. Werken met een timer
Veel spellen spelen zich in realtime af, dwz de gebruiker kan niets doen, maar bepaalde gebeurtenissen vinden nog steeds plaats in het spel. Om u in staat te stellen dergelijke spellen te implementeren, hebben we een timer aan de game-engine toegevoegd.
Zo werkt het: u zet de timer aan en stelt de tijd in waarna deze moet worden geactiveerd. Bijvoorbeeld 500 ms. Vervolgens roept de CodeGym-game-engine elke halve seconde de onTurn()
methode aan. Een oneindig aantal keren - totdat de timer wordt uitgeschakeld.
Hoe gebruik je een timer?
1. Schakel de timer in
Om de timer in te schakelen, hebben we de void setTurnTimer(int timeMs)
methode. De methode neemt als argument de duur (in milliseconden of 1/1000s van een seconde) van het interval tussen callbacks. U hoeft deze methode maar één keer aan te roepen en de game-engine begint de onTurn()
methode elke timeMs
milliseconde aan te roepen.
2. Negeer de onTurn(int)
methode
Om dit te doen, moet u een void onTurn(int step)
methode declareren in een klasse die de Game
klasse overerft. De game-engine roept deze methode aan. Bij elke aanroep geeft de engine een volgnummer door dat de methodeaanroep identificeert ( 1
, 2
, 3
, ...).
3. Schakel de timer uit
Als de timer niet meer nodig is, bijvoorbeeld omdat de gebruiker het spel heeft beëindigd, dan kan deze worden uitgeschakeld. Om dit te doen, roept u gewoon de stopTurnTimer()
methode aan.
4 Versnel/wijzig de timer
In sommige games neemt de frequentie van gebeurtenissen regelmatig toe, dus het zou handig zijn om onze timer te versnellen, dwz de tijd tussen callbacks te verkorten. En niets is eenvoudiger: bel gewoon setTurnTimer(int timeMs)
opnieuw met de nieuwe waarde en de tijd tussen oproepen naar onTurn()
zal veranderen.
Voorbeeld:
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);
}
}
...
}
In dit eenvoudige voorbeeld hebben we een veld gemaakt van 3 cellen bij 3 cellen. Vervolgens hebben we een timer ingeschakeld die de methode elke halve seconde aanroept onTurn()
.
Hier verandert de kleur van de centrale cel elke halve seconde. De tekst van de cel verandert niet. Na 50 seconden (100 callbacks) verandert de kleur niet meer en wordt de timer uitgeschakeld.