Hallo Tom,
hier ein Vorschlag:
Die Anzahl Leben sind eine Angelegenheit des Spielers. Also fügen wir in der Spieleklasse eine Variable Leben ein.
- class Spieler(Actor):
- def __init__(self, x, y):
- super().__init__('run__000')
- self.aktiv = False
- self.leben = 2
-
- self.baseX = x
- ...
Beim Start müssen wir jetzt unterscheiden, ob es ein neues Spiel oder nur ein Neustart nach einem Lebensverlust ist. Damit die Methode start() noch wie bisher funktioniert, verwenden wir einen Parameter mit Defaultwert.
Die Leben werden nur auf 2 gesetzt, wenn es sich um ein vollständig neues Spiel handelt.
- def start(self, restart=False):
- # Aufrecht stehender Spieler an der Grundposition
- if not restart: self.leben = 2 # Bei einem neuen Spiel auf 2 setzen
- self.x = self.baseX
- ...
In kollision() wird ein Leben weggenommen. Dabei muss getestet werden, ob aller Leben aufgebraucht sind.
Wenn nicht, könnte man hier einen Effekt einbauen. Ich verzichte aber darauf und setze darum nur pass ein.
- def kollision(self):
- self.leben -= 1 # Leben wegnehmen
- if self.leben:
- # Es sind noch Leben vorhanden
- pass
- else:
- # Alle Leben aufgebraucht
- self.angle = -90 # Spierler fällt um
- self.y = self.baseY # er liegt am Boden
- self.stopp()
Damit hätte der Spieler alle notwendigen Fähigkeiten.
Der Rest wird im Hauptprogramm erledigt.
Zuerst müssen wir in zeichne_spielfeld() das Anzeigen der Leben vorbereiten.
- def zeichne_spielfeld(self):
- ...
- screen.draw.text(str(self.punkte), (WIDTH - 80, 10), fontsize=60, color=farbe_schrift)
- screen.draw.text(str(self.spieler.leben), (WIDTH - 80, 80), fontsize=60, color=farbe_schrift) ###
- if self.finished:
- ...
Jetzt müssen wir in update() noch den Spielverlauf beeinflussen.
Wenn eine Kollision erfolgt ist, teilen wird das dem Spieler mit spieler.kollision() mit.
Danach wird getestet, ob noch Leben vorhanden sind.
Wenn ja, lassen wir die Hindernisse verschwinden, starten den Spieler neu (mit der Option restart=True) und zeichnen alles neu. Danach brechen wir die Schleife ab, da jetzt alle Hindernisse verschwunden sind.
- for hindernis in self.hindernisse:
- # Auf Kollision testen
- if hindernis.colliderect(self.spieler):
- self.spieler.kollision()
- if self.spieler.leben: # Es sind noch Leben vorhanden
- self.hindernisse.clear() # alle Hindernisse verschwinden lassen
- self.spieler.start(True) # setzt Leben nicht zurück
- self.draw() # alles neu zeichnen
- break # Schleife abbrechen, da keine Hindernisse mehr vorhanden sind
- else:
- hindernis.kollision()
- self.stopp() # Hier wird auch die Hintergrundmusik gestoppt
- sounds.gameover.play() # Gameover - Sound abspielen
Alles anzeigen
Ich hoffe, das war nicht all zu verwirrend.
Es ist nur eine Minimallösung. Man könnte noch visuelle Effekte oder Töne beim Verlust eines Lebens einbauen.
Gruss
René