Spiel vorbei

Spiel vorbei#

Typischerweise passiert bei einem Game-Over-Ereignis Folgendes:

  1. Das Spiel wird angehalten

  2. Ein Text erscheint (ggf. mit einem Highscore)

  3. Es gibt eine Möglichkeit, das Spiel neu zu starten

Zunächst ist es sinnvoll, eine Methode zu definieren, die alle Akteure erstellt, die beim Start eines Spiels benötigt werden:

def setup():
    player = Circle(40,100)
    @player.register
    def on_key_pressed(self, keys):
        global running
        if running:
            if 's' in keys:
                self.y += 1
            if 'w' in keys:
                self.y -= 1
        else:
            setup()
    @player.register
    def on_detecting_actor(self, other):
        if other in enemies:
            game_over()

Diese Methode erstellt ein Spielerobjekt und registriert bereits Ereignisse dafür. Wenn zum Beispiel ein anderer Akteur erkannt wird, wird die Methode game_over ausgelöst.

In der Methode game_over wird die Welt angehalten:

def game_over():
    global running
    running = False
    Text(100,100, "Game Over")
    world.stop()

Global wird überprüft, ob die LEERTASTE gedrückt wird – wenn die Welt angehalten ist, wird die Methode restart ausgelöst:

@world.register
def on_key_down(self, keys):
    global running
    if not running and "SPACE" in keys:
        restart()

Die Methode restart entfernt alle Akteure, startet die Welt neu und ruft setup auf:

def restart():
    global running
    enemies = []
    for actor in world.actors:
        actor.remove()
    world.start()
    running = True
    setup()

Vollständiges Beispiel:

from miniworlds import *
import random

running = True
enemies = []

world = World()

def setup():
    player = Circle(40,100)
    @player.register
    def on_key_pressed(self, keys):
        global running
        if running:
            if 's' in keys:
                self.y += 1
            if 'w' in keys:
                self.y -= 1
        else:
            setup()
    @player.register
    def on_detecting_actor(self, other):
        if other in enemies:
            game_over()

def game_over():
    global running
    running  = False
    Text(100,100, "Game Over")
    world.stop()
    
def restart():
    global running
    enemies = []
    for actor in world.actors:
        actor.remove()
    world.start()
    running = True
    setup()
    
def create_enemy():
    global enemies
    enemy = Circle(400, random.randint(0,400))
    enemies.append(enemy)
    @enemy.register
    def act(self):
        self.x -= 1
        if self.x < 0:
            enemies.remove(self)
            self.remove()
    
@world.register
def act(self):
    if self.frame % 50 == 0:
        create_enemy()

@world.register
def on_key_down(self, keys):
    global running
    if not running and "SPACE" in keys:
        restart()
        
setup()
world.run()