Space Shooter 1. Grundlegende Funktionen Lade das Szenario SpaceShooter-0. In diesem Spiel soll zunächst nur Folgendes geschehen: Die Gesteinsbrocken sollen sich von selbst von rechts nach links bewegen. Die Rakete soll per Tastatursteuerung den Gesteinsbrocken nach oben und unten ausweichen können. Übernimm die Steuerung der Rakete indem du die Methode act() der Klasse Rocket bearbeitest. lege eine neue Methode steerupdown() an, die du in act() aufrufst. Die Auslagerung der Funktion in die Methode steerupdown() scheint hier zunächst umständlich und überflüssig, schafft aber später mehr Überblick im gesamten Programm: steerupdown(); public void steerupdown() { if (Greenfoot.isKeyDown("up")) { setlocation(60, gety() - 5); Ergänze eine entsprechende Möglichkeit für die Abwärtsbewegung und teste das Programm. Die Methode getx() ermittelt die aktuelle X-Position des Objektes. Mit setlocation(x, y) wird dem Objekt eine neue Position zugewiesen. Um die Gesteinsbrocken nach links zu bewegen, muss die Methode act() der Klasse Rock bearbeitet werden. Weil der Rock auch später wenig eigenen Funktionalität haben wird, kann der Code direkt in die Methode act() geschrieben werden: setlocation(getx()-4, gety()); Das Spiel ist jedoch schell am Ende, da die Brocken am linken Bildschirmrand verharren. Ergänze die Steuerung des Brockens so, dass er, sobald er den linken Rand erreicht hat, wieder an einer zufälligen Position am rechten Rand wieder auftaucht. Mit Greenfoot.getRandomNumber(max) kannst du eine Zufallszahl ermitteln. Experimentiere auch mit verschiedenen Geschwindigkeiten der Brocken. Speichere dein Programm als SpaceShooter-1 und gebe es ab. Java programmieren mit Greenfoot: Space Shooter - Grundlegende Funktionen S. 1
1.1) Auf die Brocken ballern Um auf die Felsbrocken feuern zu können, benötigen wir ein Geschoss (Bullet), dass von der Rakete weg zum rechten Rand fliegt. Dazu muss beim Schuss, der mit der Space-Taste ausgelöst werden soll, ein neues Objekt der Klasse Bullet erstellt werden. Wir ergänzen also Rocket um die Methode shootgun(): 1 public void shootgun() { if (Greenfoot.isKeyDown("space")) { getworld().addobject(new Bullet(), getx(), gety()); Nun muss das Objekt noch auf geradem Weg an den rechten Rand bewegt werden. Das erfolgt genau wie bei den Gesteinsbrocken, nur in umgekehrter Richtung. Nun muss noch von der Methode act() der Klasse Bullet überprüft werden, ob ein Brocken getroffen ist und dieser dann beseitigt werden. setlocation(getx() +5, gety()); if (istouching(rock.class)) { removetouching(rock.class); Nun bestehen noch zwei Probleme: die Geschosse verbleiben am rechten Rand und wenn alle drei Brocken zerstört sind, erscheinen keine neuen Brocken. In der Klasse Bullet müssen also ein paar Ergänzungen vorgenommen werden: Wenn die X-Position am Bildschirmrand ist, muss das Geschoss gelöscht werden. Wenn ein Brocken zerstört ist, muss am rechten Rand ein neuer Brocken entstehen. Mit der folgenden Anweisung kann sich ein Objekt selbst löschen: getworld().removeobject(this); Das Erstellen eines neuen Objekts kann aus der Methode shootgun() übernommen werden. Ergänze die Methode act() entsprechend und speichere das Ergebnis als SpaceShooter-2 ab. 1.2) Punkte zählen Der Spieler soll Punkte erhalten, wenn er einen Brocken abschießt und im Gegenzug Punkte verlieren, wenn ein Gesteinsbrocken den linken Bildschirmrand erreicht. 2 Zunächst muss in der Klasse Space mitprivate int score; eine Variable angelegt werden. Außerdem muss diese Variable bei Beginn des Spiels auf 0 gesetzt werden, dies erfolgt in der Konstruktor-Methode: private int score; void Space() { 1 Die nachfolgende Programmierung basiert auf SpaceShooter-1. 2 Die nachfolgende Programmierung basiert auf SpaceShooter-2. Java programmieren mit Greenfoot: Space Shooter - Grundlegende Funktionen S. 2
score = 0; Bei der Programmierung mit JAVA ist es nich üblich, direkten aus anderen Objekten heraus direkten Zugriff auf Variablen zuzulassen, deshalb wird score alsprivate definiert und eine Methode addtoscore() für den Zugriff angelegt. Die Funktion muss einen Parameter int value erhalten, der dann zu score addiert wird. public void addtoscore(int value) { score = score + value; showtext("score: " + value, 50, 30); Die Methode showtext() positioniert den anzuzeigenden Text hier bei x=50 und y=30. Leider ist es nicht ganz einfach möglich, die Methode addtoscore() aus den Objekten Bullet oder Rock heraus aufzurufen, weil diese nicht direkt vererbt wird. In der Klasse Rock kann die Methode mit dieser Konstruktion 3 aufgerufen werden: Space myspace = (Space)getWorld(); myspace.addtoscore(value); Der Punktestand soll immer um den Wert 10 erhöht werden, wenn ein Brocken getroffen wurde und um den Wert 7 reduziert werden, wenn ein Brocken den linken Rand erreicht hat. Das Spiel soll nach einer bestimmten Zeit beendet werden. Dazu fügen wir in der Klasse Rocket einen Timer ein, der beim Erstellen der Rakete auf den Wert 1000 gestellt wird. Die Methode act() muss dann so adaptiert werden: timer--; if (timer > 0) { else { steerupdown(); shootgun(); Greenfoot.stop(); Zunächst wird der Timer um den Wert 1 reduziert (timer--), sollte der Wert nicht größer als 0 sein, wir das Spiel beendet. Zusätzlich könntest du mit showtext() oben rechts im Bildschirm den Timer einblenden. Speichere dein Ergebnis als SpaceShooter-3. 3 Der genauere Hintergrund dieser Konstruktion muss aufgrund der dafür erforderlichen Kenntnisse später erläutert werden. Java programmieren mit Greenfoot: Space Shooter - Grundlegende Funktionen S. 3