Anleitung: Flappy Bird#
In diesem Kapitel erstellen wir Schritt für Schritt ein Flappy-Bird-Spiel mit der miniworlds_physics
-Engine.
Schritt 1: Die Physik-Engine importieren#
Installiere das Paket miniworlds_physics
genauso wie miniworlds
. Dann importierst du PhysicsWorld
:
import random
from miniworlds import Actor, Number, Text
from miniworlds_physics import PhysicsWorld # Import the physics engine
world = PhysicsWorld(800, 600)
# Your code goes here
world.run()
Schritt 2: Röhren erstellen#
Röhren hinzufügen und in einer Liste speichern#
Füge mehrere Röhren hinzu und speichere sie in einer Liste, damit du ihre Eigenschaften später einfacher verwalten kannst:
pipes = [
Actor(position=(300, world.height - 280)),
Actor(position=(500, 0)),
Actor(position=(700, world.height - 280)),
Actor(position=(900, 0))
]
Röhreneigenschaften festlegen#
Verwende eine Schleife, um Eigenschaften für alle Röhren festzulegen:
for pipe in pipes:
pipe.direction = 0
pipe.add_costume("images/pipe1.png")
pipe.size = (50, 280)
pipe.passed = False
pipe.physics.simulation = "manual"
pipe.physics.velocity_x = -150
pipe.origin = "topleft"
Drehe die 2. und 4. Röhre (die nach unten zeigen) um 180 Grad:
pipes[1].costume.orientation = -180
pipes[3].costume.orientation = -180
Methoden für Röhren registrieren#
Füge den Röhren zwei wichtige Methoden hinzu:
for pipe in pipes:
@pipe.register
def act(self):
if self.x < 75 and not self.passed:
self.passed = True
@pipe.register
def on_detecting_left_border(self):
self.move_to((self.x + random.randint(750, 800), self.y))
self.passed = False
Schritt 3: Den Vogel erstellen#
Attribute des Vogels festlegen#
Der Vogel ist ein Actor
mit Physik:
bird = Actor()
bird.position = (75, 200)
bird.add_costume("images/fly.png")
bird.size = (60, 60)
bird.physics.simulation = "simulated"
bird.is_flipped = True
bird.physics.size = (0.8, 0.8)
bird.physics.shape_type = "circle"
bird.is_rotatable = False
Methoden für den Vogel registrieren#
Bildschirmränder erkennen#
Wenn der Vogel oben oder unten anstößt, wird das Spiel beendet:
@bird.register
def on_detecting_borders(self, borders):
if "bottom" in borders or "top" in borders:
end = Text("Game over!", position=(400, 200))
world.game_over = True
world.stop()
Kollisionen mit Röhren erkennen#
Wenn der Vogel eine Röhre berührt, wird das Spiel beendet:
@bird.register
def on_detecting_actor(self, other):
if other in pipes:
end = Text("Game over!", position=(200, 200))
world.game_over = True
world.stop()
Tasteneingaben erkennen#
Wenn die Leertaste gedrückt wird, fliegt der Vogel nach oben:
@bird.register
def on_key_down_space(self):
self.physics.velocity_y = -200
if not world.is_running and not world.game_over:
world.start()
Schritt 4: Punktestand hinzufügen#
Der Punktestand wird mit einem statischen Number
-Objekt angezeigt:
score = Number()
score.position = (30, 30)
score.size = (40, 40)
score.physics.simulation = "static"
In der act
-Methode der Röhre wird der Punktestand erhöht:
@pipe.register
def act(self):
if self.x < 75 and not self.passed:
self.passed = True
score.inc()
Vollständiger Code#
import random
from miniworlds import Actor, Number, Text
from miniworlds_physics import PhysicsWorld
world = PhysicsWorld(800, 600)
world.game_over = False
world.add_background("images/background.png")
pipes = [
Actor(position=(300, world.height - 280)),
Actor(position=(500, 0)),
Actor(position=(700, world.height - 280)),
Actor(position=(900, 0))
]
for pipe in pipes:
pipe.add_costume("images/pipe1.png")
pipe.size = (50, 280)
pipe.passed = False
pipe.physics.simulation = "manual"
pipe.physics.velocity_x = -150
pipe.origin = "topleft"
@pipe.register
def act(self):
if self.x < 75 and not self.passed:
self.passed = True
score.inc()
@pipe.register
def on_detecting_left_border(self):
self.move_to((self.x + random.randint(750, 800), self.y))
self.passed = False
pipes[1].costume.orientation = -180
pipes[3].costume.orientation = -180
score = Number()
score.position = (30, 30)
score.size = (40, 40)
score.physics.simulation = "static"
bird = Actor()
bird.position = (75, 200)
bird.add_costume("images/fly.png")
bird.size = (60, 60)
bird.physics.simulation = "simulated"
bird.is_flipped = True
bird.physics.size = (0.8, 0.8)
bird.is_rotatable = False
@bird.register
def on_detecting_borders(self, borders):
if "bottom" in borders or "top" in borders:
end = Text("Game over!", position=(400, 200))
world.game_over = True
world.stop()
@bird.register
def on_detecting_actor(self, other):
if other in pipes:
end = Text("Game over!", position=(200, 200))
world.game_over = True
world.stop()
@bird.register
def on_key_down_space(self):
self.physics.velocity_y = -200
if not world.is_running and not world.game_over:
world.start()
world.run()