Appearance
6 — Kollision
Wenn das Schiff mit einem Hindernis kollidiert, sollte Lebensenergie abgezogen werden. Ausserdem sollte der Zustand des Spiels zurückgesetzt werden, ansonsten findet gleich die nächste Kollision statt.
Verlust von Lebensenergie
Die Überprüfung, ob das Schiff mit einem Hindernis kollidiert, wird am einfachsten im Unterprogramm bewegeHindernis vorgenommen. Dieses Unterprogramm wird ja schon für jedes Hindernis aufgerufen. Wenn hier der zusätzliche Code eingebaut wird, wird die Überprüfung automatisch für jedes Hindernis stattfinden.
Die eigentliche Überprüfung wird mit einer bedingten Anweisung vorgenommen. Das sieht so aus (der Code zum Bewegen des Hindernisses ist des Übersichtlichkeit halber weggelassen worden):
python
def bewegeHindernis(hindernis):
# Bewegen des Hindernisses ...
if hindernis.colliderect(schiff):
schiff.leben = schiff.leben - 1Die Lebensenergie wird in der Variable leben des Schiffes verwaltet. Diese muss nach dem Erstellen des Schiffes initialisiert werden:
python
schiff = Actor("...")
schiff.leben = 3Anzeige der Lebensernergie (Variante 1)
Die Lebensenergie kann gleich dargestellt werden wie die Punkte im ersten Spiel. Das heisst, sie werden im Unterprogramm draw mit Hilfe von screen.draw.text gezeichnet.
python
def draw():
screen.draw.text("Leben: " + str(schiff.leben), left=10, top=30, fontsize=40)Anzeige der Lebensernergie (Variante 2)
In vielen Computerspielen wird die Lebensenergie als Reihe von Herzen dargestellt. Da dies Grafiken sind, muss jedes Herz mit einem Actor dargestellt werden.
python
herz1 = Actor("herz.png")
herz2 = Actor("herz.png")
herz2.x = 70
herz3 = Actor("herz.png")
herz3.x = 140Nun können diese «Figuren» im draw-Unterprogramm verwendet werden, um die Lebensenergie darzustellen. Es dürfen aber nur diejenigen Herzen gezeichnet werden, die der Anzahl Leben entsprechen
python
def draw():
if schiff.leben > 0:
herz1.draw()
if schiff.leben > 1:
herz2.draw()
if schiff.leben > 2:
herz3.draw()Dies wird wie oben dargestellt mit Hilfe von entsprechenden bedingten Anweisungen erreicht.
✏️ Aufgabe 3.6a — Lebensenergie verwalten
Erweitern Sie das Programm, sodass die Lebensenergie in der Variable schiff.leben gespeichert und verwaltet wird.
- Beim Erstellen des Schiffs wird die Lebensenergie auf
3gesetzt. - Bei einer Kollision wird die Lebensenergie um
1reduziert. - Die Lebensenergie wird angezeigt.
Spiel «zurücksetzen»
Nach jeder Kollision muss das Spiel zurückgesetzt werden. Das bedeutet, dass alle Figuren (Schiff und Hindernisse) auf ihre ursprüngliche Position gesetzt werden.
Da wir dies schon programmiert haben, bietet es sich an, den vorhandenen Code wiederzuverwenden. Dazu muss er in ein neues Unterprogramm verlagert werden. Dieses soll zurücksetzen heissen. Darin werden die Positionen von Schiff und Hindernissen gesetzt:
python
def zurücksetzen():
schiff.x = WIDTH / 2
schiff.y = HEIGHT - 60
insel1.y = -100
insel2.x = 270
insel2.y = -450Dieses Unterprogramm muss nun an zwei Orten aufgerufen werden:
- vor dem Start des Programms, also vor
pgtrun.go() - bei einer Kollision.
✏️ Aufgabe 3.6b — Spiel zurücksetzen
- Erstellen Sie das Unterprogramm
zurücksetzenwie oben beschrieben. - Rufen Sie das Unterprogramme an den oben beschriebenen Stellen auf.
Game Over
✏️ Aufgabe 3.6c — Game Over
Erweitern Sie das Programm, sodass «Game Over» angezeigt wird, wenn die Lebensenergie kleiner als 1 wird.