Der Weltraumschrott

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 Raumschiff 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); 
   }
}

Kollision und Verlassen des sichtbaren Bereichs

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.