Erweiterungen
Wie immer stellt sich die Frage, was man alles verbessern, erweitern und ausbauen könnte. Wie immer bist du gefragt, deine eigenen Ideen mit einzubringen. Meine Vorschläge kommen jetzt – aber deine Ideen sind genauso wertvoll. Vielleicht hast du ja eine Vision, was man mit diesem Spiel noch alles machen könnte. Begrenzt sind die Möglichkeiten nur durch deine Phantasie!
Explosionen
Wie wäre es, wenn die Aliens immer mit einer kurz aufleuchtenden Explosion verschwinden würden. Das lässt sich recht einfach machen, weil uns TigerJython sogar eine Mini-Explosionsgrafik mitliefert. Die Explosion soll aber nur ganz kurz erscheinen, nachdem der Alien entfernt wurde, dann muss sie wieder verschwinden. Dazu brauchen wir eine Klasse Explosion, die in der act-Methode einen kurzen Zähler runterzählt und dann ihr Objekt wieder löscht.
class Explosion(Actor):
timer = 5
def act(self):
self.timer -= 1
if self.timer == 0:
feld.removeActor(self)
Bei Entstehung steht der timer von Explosion auf 5, in jeder act-Methode wird er um 1 heruntergezählt, und bei 0 verschwindet die kleine Explosion wieder.
Aufgerufen wird diese Explosionsgrafik natürlich dort, wo die Kollision festgestellt wird: In der collide()-Methode von Geschoss:
def collide(self,actor1,actor2):
xpos = actor2.getX()
ypos = actor2.getY()
feld.removeActor(self)
feld.removeActor(actor2)
hit = Explosion("sprites/hit.gif")
feld.addActor(hit,Location(xpos,ypos))
if feld.getNumberOfActors(Alien) == 0:
gewonnen()
return 0
Jetzt sollte das Raumschiff aber ebenfalls explodieren, wenn es getroffen wird. Das geht mehr oder weniger genauso. Die Klasse haben wir schon, jetzt muss der Effekt nur noch in die Funktion gameover() eingebaut werden. Für das Raumschiff steht uns sogar noch eine etwas größere Explosionsgrafik zur Verfügung.
def gameover():
explosion = Explosion("sprites/explosion.gif")
feld.addActor(explosion,Location(raumschiff.getX(),590))
feld.removeActor(raumschiff)
feld.doPause()
msgDlg("GAME OVER")
Ausprobieren! Viel besser!
Abbildung 20.10 Mit Explosionen sieht alles noch viel cooler aus!
Sound
Bei Explosionen fällt natürlich besonders auf, dass der Sound fehlt. Den nachzurüsten ist ja jetzt auch kein großer Aufwand mehr.
Am Anfang muss natürlich das Modul soundsystem importiert werden (from soundsystem import *), dann kann der Sound an der jeweiligen Stelle abgespielt werden.
Beim Abschießen der Aliens (collide-Methode der Klasse Geschoss) kann der click-Sound gespielt werden:
openSoundPlayer("wav/click.wav")
play()
Und wenn das Raumschiff zerstört wird, kommt der richtige Explosions-Sound:
def gameover():
openSoundPlayer("wav/explode.wav")
play()
explosion = Explosion("sprites/explosion.gif")
feld.addActor(explosion,Location(raumschiff.getX(),590))
feld.removeActor(raumschiff)
feld.doPause()
msgDlg("GAME OVER")
Spielende
Die Message Box, die uns das Ende des Spiels anzeigt, ist zwar funktional, aber nicht elegant oder schön. Besser wäre es, wenn ein farbiges »Game Over« auf dem Spielfeld erschiene. Das lässt sich natürlich auch machen. Wenn du die mitgelieferte Grafik gameover.gif von TigerJython verwenden willst, ist es am einfachsten – eine selbst gestaltete Grafik ist natürlich noch cooler. Mit der eingebauten Grafik änderst du einfach die Funktion gameover() folgendermaßen ab:
def gameover():
openSoundPlayer("wav/explode.wav")
play()
explosion = Explosion("sprites/explosion.gif")
feld.addActor(explosion,Location(raumschiff.getX(),590))
feld.removeActor(raumschiff)
spielende = Actor("sprites/gameover.gif")
feld.addActor(spielende,Location(300,300))
feld.doPause()
Abbildung 20.11 Noch besser als eine Message Box