Den abstrakta klassen GameTemplate |
import se.lth.cs.pt.game.graphics.GameTemplate; |
Klassen GameTemplate
är en mall för händelsestyrda
program i ett GraphicsWindow
- den som utvidgar klassen GameTemplate
behöver bara
implementera några få operationer (se nedan) för att få ett
fungerande program.
De operationer som kan överskuggas dokumenteras nedan - ett
enkelt exempel på program är följande:
import se.lth.cs.pt.graphics.*;
import se.lth.cs.pt.graphics.events.*;
import se.lth.cs.pt.game.graphics.*;
import java.util.Random;
class SampleGame extends GameTemplate {
protected final int
LEFT_ARROW = 37,
UP_ARROW = 38,
RIGHT_ARROW = 39,
DOWN_ARROW = 40,
QUIT_KEY = 81;
protected Sprite sprite;
protected int width, height;
protected double x, y;
protected Random rng = new Random();
public void setup() {
width = 500;
height = 500;
x = width/2;
y = height/2;
w = new GraphicsWindow(width,height);
sprite = new Sprite("ball.png", x, y);
w.add(sprite);
w.checkKeys(true,false,false);
w.checkMouse(true,false,false,false,false);
w.timeStep(1000);
}
public void keyPressed(char key, int code) {
// Om vi vill använda pil-tangenter bryr vi oss
// inte om key-värdet:
switch (code) {
case LEFT_ARROW:
x -= 10;
break;
case RIGHT_ARROW:
x += 10;
break;
case UP_ARROW:
y -= 10;
break;
case DOWN_ARROW:
y += 10;
break;
case QUIT_KEY:
quit();
break;
}
redraw();
}
public void mouseClicked(double xPos, double yPos, int button) {
if (button == 1) { // vänsterknappen
x = xPos;
y = yPos;
redraw();
}
}
public void tick() {
x += rng.nextDouble()*20-10;
y += rng.nextDouble()*20-10;
redraw();
}
protected void redraw() {
sprite.moveTo(x,y);
}
}
Programmet ovan kan startas med anropet:
new SampleGame().run();
Några viktiga saker att lägga märke till:
- Du ärver ett attribut
w
, och får inte
ha något eget attribut med samma namn!
- De operationer som du överskuggar måste
public
-deklareras.
Metoder |
void run() |
| Startar programmet (kan inte överskuggas). |
|
void quit() |
| Gör att programmet avslutas. |
|
boolean timeToQuit() |
| Avgör om det är dags att avsluta (kan överskuggas, om du inte
hellre vill anropa quit() , se ovan). Denna metod
skall du inte anropa själv, den anropas automatiskt i
händelseloopen -- den skall returnera true när det
är dags att avsluta programmet, false annars. |
|
void setup() |
| Initierar attribut. Måste skapa ett fönster w , och
meddela vilka händelser som skall hanteras. Skall även starta
klockan (w.timeStep ), om vi vill ha diskreta
tiddsteg. Observera att du inte får ha något eget fönster
w i din subklass (ett sådant fönster skulle
'överskugga' det fönster som GameTemplate använder
för att vänta på händelser). |
|
void tick() |
| Anropas när ett tidssteg har gått (initieras genom att skriva
w.timeStep(tidssteg) i setup ). |
|
void keyPressed(char ch, int code) |
| Anropas när en tangent har tryckts ned (kräver att
w.checkKeys har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| key : | 'tecknet' på den tangent som trycktes ned. |
| code : | tangent-kod för den aktuella tangenten. |
|
|
void keyReleased(char ch, int code) |
| Anropas när en tangent har släppts upp (kräver att
w.checkKeys har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| key : | 'tecknet' på den tangent som trycktes ned. |
| code : | tangent-kod för den aktuella tangenten. |
|
|
void keyTyped(char ch, int code) |
| Anropas efter fullbordad tangent-tryckning (kräver att
w.checkKeys har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| key : | 'tecknet' på den tangent som trycktes ned. |
| code : | tangent-kod för den aktuella tangenten. |
|
|
void mouseClicked(double x, double y, int button) |
| Anropas när användaren har klickat med musen (kräver att
w.checkMouse har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| x : | x-koordinat |
| y : | y-koordinat |
| button : | musknapp (1 = vänsterknappen) |
|
|
void mousePressed(double x, double y, int button) |
| Anropas när användaren har tryckt ned musen (kräver att
w.checkMouse har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| x : | x-koordinat |
| y : | y-koordinat |
| button : | musknapp (1 = vänsterknappen) |
|
|
void mouseReleased(double x, double y, int button) |
| Anropas när användaren har släppt upp musen (kräver att
w.checkMouse har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| x : | x-koordinat |
| y : | y-koordinat |
| button : | musknapp (1 = vänsterknappen) |
|
|
void mouseDragged(double x, double y, int button) |
| Anropas när användaren har släpat musen (kräver att
w.checkMouse har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| x : | x-koordinat |
| y : | y-koordinat |
| button : | musknapp (1 = vänsterknappen) |
|
|
void mouseMoved(double x, double y) |
| Anropas när användaren har flyttat musen (kräver att
w.checkMouse har initierats på rätt sätt i
setup() ). |
|
Parametrar: |
| x : | x-koordinat |
| y : | y-koordinat |
|
|