Die hier verwendete Entwicklungsumgebung stellt verschiedene Grafiken zur Verfügung, die für
Spiele oder Animationen verwendet werden können. Grafiken werden als Objekte der Klasse Sprite
(engl. Bezeichnung für ein Geistwesen, Kobold) erzeugt.
Grafische Objekte wie Sprites werden dabei in einem Grafikfenster dargestellt, das 800 Pixel breit und 600 Pixel hoch ist. Der Ursprung liegt in der
linken oberen Ecke des Fensters. Nach rechts verläuft die x-Achse, nach unten die y-Achse.
Wir deklarieren zunächst eine Variable mit dem Namen meinSprite
vom Datentyp Sprite
.
Anschließend wird ein neues Sprite-Objekt erzeugt. Der Konstruktor erwartet vier Parameter:
Im Internet gibt es eine Übersicht über alle verfügbaren Grafiken für Sprites. Wir verwenden die Sammlung Space_Shooter_1 und wählen das Raumschiff mit der Nummer 2.
Das folgende Programm zeigt, wie der das Objekt der Klasse Sprite erzeugt wird und Methoden der Klasse verwendet werden können.
meinSprite.moveTo(20, 20); for(int i = 0; i < 140; i++) { meinSprite.move(5, 0); // Sprite um insgesamt 700px nach rechts bewegen } for(int i = 0; i < 110; i++) { meinSprite.move(0, 5); // Sprite um insgesamt 550px nach unten bewegen }
Ein Objekt der Klasse Sprite
können wir zwar mit den vorhandenen Methoden der Klasse bewegen.
Wir wollten unser Raumschiff aber mit weiteren Attributen, wie z. B. einem Namen für den Spieler oder einer Geschwindigkeit, und weiteren
Methoden ausstatten.
Dazu nutzen wir das Prinzip der Vererbung, d.h. wir schreiben eine Klasse Raumschiff
,
die die Klasse Sprite
erweitert.
Innerhalb des Konstruktors der Klasse Raumschiff
muss mit der Methode super()
der
Konstruktor der Oberklasse Sprite
aufgerufen werden. Als Parameter verwenden wir die gleichen
wie oben. Das folgende Beispiel zeigt dies.
Ergänze den Quelltext im oberen Fenster, so dass die Klasse die im Klassendiagramm beschriebenen Attribute besitzt.
Der Konstruktor soll aus dem Parameter den Namen übernehmen und die x- und y-Position
des Raumschiffs beim Aufruf von super()
setzen.
0.2
, die Geschwindigkeit in
x-Richtung vx
auf 0.3
und die Geschwindigkeit in y-Richtung vy
auf 0.7
festgelegt werden.vx
und vy
stehen dabei für die Geschwindigkeit des Raumschiffs
in x- bzw. y-Richtung. beschleunigung
beschreibt, wie stark das Raumschiff seine Geschwindigkeit
ändert, wenn es später durch Tasten gesteuert wird.
class Raumschiff extends Sprite { // Attribute der Klasse Raumschiff String name; double vx; double vy; double beschleunigung; Raumschiff(String name, double x, double y) { // Konstruktor der Klasse Sprite super(x, y, SpriteLibrary.Space_Shooter_1, 2); this.name = name; beschleunigung = 0.2; vx=0.3; vy=0.7; } } // Deklaration einer Variablen der Klasse Raumschiff Raumschiff raumschiff1; // Erzeugen eines Raumschiff-Objekts raumschiff1 = new Raumschiff("Captain Kirk", 100, 50);
act()
Unser Raumschiff soll durch Tasten in allen vier Bewegungsrichtungen zu steuern sein.
Dazu nutzen wir die Methode act()
, die die Klasse Sprite
bereits besitzt.
Diese Methode wird automatisch ca. 30 Mal in der Sekunde aufgerufen.
In der Klasse Sprite
ist der Methodenrumpf zunächst leer, eine erbende Klasse kann aber nun
diese Methode überschreiben, d.h. sie wird in der Klasse Raumschiff
noch einmal implementiert. Das folgende Beispiel zeigt das Verhalten der Methode act()
.
Verändere die Implementierung der Klasse, so dass bei jedem Aufruf der Methode
act()
das Raumschiff um vx
nach rechts und
um vy
nach unten bewegt wird.
void act() { move(vx, vy); }
Unser Raumschiff bewegt sich jetzt schon selbstständig bei gleich bleibender Geschwindigkeit in die
beiden Raumrichtungen. Jedes Mal, wenn die Methode act()
automatisch aufgerufen wird
- und das passiert etwa 30 Mal pro Sekunde - wird das Raumschiff um vx
nach rechts und
um vy
nach unten verschoben.
Die Steuerung funktioniert nun so, dass bei Drücken einer Taste (z. B. einer der vier Pfeiltasten) der Wert
der Geschwindigkeit vergrößert bzw. verkleinert wird. Als Veränderung verwenden wir dabei den Wert des
Attributs beschleunigung
, also 0.2
.
Dazu fragen wir innerhalb der Methode act()
ab, ob eine der Tasten gerade gedrückt ist.
Das folgende Beispiel zeigt dies für die linke Pfeiltaste.
Ergänze den Quelltext in der Methode act()
, so dass die Geschwindigkeit
des Raumschiffs auch beim Drücken der anderen drei Pfeiltasten entsprechend verändert wird.
if(isKeyDown(Key.ArrowLeft)) { vx = vx - beschleunigung; } if(isKeyDown(Key.ArrowRight)) { vx = vx + beschleunigung; } if(isKeyDown(Key.ArrowUp)) { vy = vy - beschleunigung; } if(isKeyDown(Key.ArrowDown)) { vy = vy + beschleunigung; }
Es ist übrigens auch möglich, zwei Tasten gleichzeitig zu betätigen.
Wir sollten nun aber noch kontrollieren, dass unser Raumschiff nicht den sichtbaren Bereich verlässt.
Die Klasse Sprite
besitzt das Attribt centerX
, das uns die momentane x-Koordinate
des Raumschiffs verrät. Innerhalb der Methode act()
sollte überprüft werden,
ob die x-Koordinate nicht kleiner als 30
oder größer als 770
ist.
Falls diese Werte unter- bzw. überschritten werden, sollte die x-Koordinate auf den Minimal- bzw.
Maximalwert und vx
auf 0 gesetzt werden. Wir bewegen das Raumschiff einfach wieder um -vx
in horizontaler Richtung ein Stück zurück.
Für die linke Randbegrenzung erreicht man dies z. B. durch:
if(centerX < 30) { move(-vx, 0); vx = 0; }
Die gleiche Korrektur ist notwendig, wenn das Raumschiff die x-Koordinate von 770 übersteigt.
Ergänze den Quelltext am Ende der Methode act()
dementsprechend.
Lösung mit zwei if
-Anweisungen:
if(centerX < 30) { move(-vx, 0); vx = 0; } if(centerX > 770) { move(-vx, 0); vx = 0; }
Das Problem kann auch mit nur einer if
-Anweisung gelöst werden, bei der mit Hilfe
des ||
-Operators (ODER-Verknüpfung) gleichzeitig der minimale bzw. maximale x-Wert überprüft wird:
if(centerX < 30 || centerX > 770) { move(-vx, 0); vx = 0; }
Zu guter Letzt setzen wir das Raumschiff noch einer geringen Schwerkraft aus. Das heißt, dass das
Raumschiff nach unten gleichmäßig beschleunigt werden soll. Beim Ausführen der
act()
-Methode addieren wir einen kleinen Wert, z. B. 0.05
zu
vy
. Dies bewirkt eine Beschleunigung nach unten.
vy = vy + 0.05; move(vx, vy);
Ergänze den Quelltext in der Methode act()
im letzten Programmfenster und
teste das Verhalten des Raumschiffs.