Unser Raumschiff soll beim Spiel entgegenkommendem Weltraumschrott ausweichen. Die Hindernisse stellen wir
durch farbig gefüllte Kreis der Klasse Circle
dar. Neben Methoden zum Verändern von Füllfarbe
und Größe besitzt die Klasse ebenfalls die Methode act()
, die wieder automatisch mehrmals pro Sekunde
aufgerufen wird.
Die Methode setFillColor(int color)
ermöglich das Setzen der Füllfarbe des Kreises.
Die Zahl für die Farbe kann dabei zwischen 0 und 255*255*255, also 16.581.375 liegen.
Wir erstellen wie beim Raumschiff eine Klasse Weltraumschrott
, die von der Klasse Circle
erbt, versehen sie mit einem Konstruktor zum Setzen der Position, des Radius. Außerdem überschreiben wird
die Methode act()
, um das Objekt zu bewegen und auf Kollisionen zu reagieren. Das folgende Klassendiagramm
zeigt die Beziehung der beiden Klassen und deren wichtigste Attribute und Methoden.
Im folgenden Programmfenster befindet sich der bisherige Stand der Klasse Raumschiff
in der gleichnamigen Datei.
Für die Klasse Weltraumschrott verwenden wir zur besseren Übersicht eine neue Datei Weltraumschrott.
Implementiere die Klasse Weltraumschrott
entsprechend dem oberen Klassendiagramm.
Schreibe einen Konstruktor, der die Parameterwerte mit Hilfe der super()
-Methode und der
Methode setFillColor()
setzt.
Überschreibe die act()
-Methode, so dass sich das Objekt mit konstanter Geschwindigkeit
nach links auf dem Grafikfenster bewegt.
Analysiere das Programm in der Datei Test und starte es.
// Klasse Weltraumschrott, die von der Klasse Circle erbt class Weltraumschrott extends Circle { Weltraumschrott(double x, double y, double radius, int color) { super(x, y, radius); setFillColor(color); } public void act() { move(-3, 0); } }
Bei einer Kollision mit dem Raumschiff und beim Verlassen des Grafikfensters soll
das Schrottteil einfach unsichtbar werden, da es nicht weiter benötigt wird.
Die Klasse Circle
stellt dazu die Methode destroy()
zur verfügung.
Eine Kollision mit irgendeinem anderen Grafikobjekt kann durch Aufruf der Methode
collidesWithAnyShape()
ermittelt werden.
Innerhalb der act()
-Methode muss mit Hilfe einer if-else
-Anweisung überprüft werden,
ob eine Kollision vorliegt oder die x-Koordinate (centerX
) negativ ist. In diesem Fall
wird das Objekt zerstört, andernfalls soll es um drei Pixel nach links verschoben werden.
Implementiere in der Methode act()
das beschriebene Verhalten.
Teste dein Programm.
public void act() { if(collidesWithAnyShape() || centerX < 0) { destroy(); }else{ move(-3, 0); } }
Die Aufgabe kann auch mit Hilfe von zwei if
-Anweisungen gelöst werdern:
public void act() { if(collidesWithAnyShape()) { destroy(); }else{ move(-3, 0); } if(centerX < 0) { destroy(); } }
Beachte: Nach dem Zerstören des Objekts ist dieses nicht mehr existent. Man muss dann
sicherstellen, dass nicht noch einmal die Methode move()
aufgerufen wird,
da es sonst zu einem Fehler kommt und das Programm abbricht.
Damit ist die Klasse Weltraumschrott
vollständig implementiert.