Anleitung: Roter Baron#

In diesem Kapitel erstellen wir Schritt für Schritt einen Side-Scrolling-Shooter.

Die Techniken zum Erstellen von Parallax-Hintergründen, zur Steuerung von Geschwindigkeit und Bewegung sowie zur Erzeugung von Gegnern sind in vielen Spielen üblich. Nach diesem Tutorial wirst du sie in deinen eigenen Projekten anwenden können.

  • Basierend auf: https://github.com/kantel/pygamezero/tree/master/tappyplane

  • Lizenz: Namensnennung-NichtKommerziell-Weitergabe unter gleichen Bedingungen 4.0 International

  • Voraussetzung: Grundkenntnisse in Klassen


Schritt 1: Grundgerüst erstellen#

Du brauchst eine Welt, in der Akteure platziert werden können. Die letzte Zeile muss world.run() sein:

from miniworlds import World, Actor, timer, Text
world = World(800, 480)

// your code here

world.run()

Ordner vorbereiten#

Lege deine Bilder für den Hintergrund, den Spieler und die Gegner im Ordner images ab:

my_code
|
|--images
|----planered1.png
|----background.png
|----groundgrass.png
|----shipbeige.png
|----shipblue.png
|----shipgreen.png
|----shippink.png
|----shipyellow.png

(Die Bilder findest du hier: miniworlds-cookbook – red baron)


Hintergründe erstellen#

Erstelle zwei Hintergründe nebeneinander, um endloses Scrollen zu simulieren:

back0 = Actor()
back0.add_costume("background")
back0.size = world.width, world.height
back1 = Actor(world.width, 0)
back1.size = world.width, world.height
back1.add_costume("background")
backs = [back0, back1]

Um sie zu animieren:

@world.register
def act(self):
    for back in backs:
        back.x -= 1
        if back.x <= -world.width:
            back.x = world.width
    for ground in grounds:
        ground.x -= 2
        if ground.x <= -world.width:
            ground.x = world.width

Schritt 2: Flugzeug-Klasse erstellen#

Flugzeug-Klasse definieren#

class Plane(Actor):
    def on_setup(self):
        self.add_costume("planered1")

Instanz erstellen#

Am Ende deines Codes:

plane = Plane(100, world.height / 2)

Physik hinzufügen#

on_setup() erweitern:

    def on_setup(self):
        self.add_costume("planered1")
        self.gravity = 0.1
        self.velocity_y = 0

Physik simulieren#

    def act(self):
        self.velocity_y += self.gravity
        self.velocity_y *= 0.9  # friction
        self.y += self.velocity_y

Aufwärtskraft bei Tastendruck hinzufügen#

    def on_key_down_w(self):
        self.velocity_y -= 5

Schritt 3: Gegner hinzufügen#

Importieren:

from random import randint, choice

Gegner-Klasse erstellen#

class Enemy(Actor):
    def on_setup(self):
        self.add_costume(choice(enemyships))

    def reset(self):
        self.x = randint(world.width + 50, world.width + 500)
        self.y = randint(25, world.height - 85)

Gegner hinzufügen#

enemies = []
for _ in range(10):
    enemy = Enemy()
    enemy.reset()
    enemies.append(enemy)

Gegner bewegen#

on_setup() erweitern:

def on_setup(self):
    self.add_costume(choice(enemyships))
    self.speed = -1.5

Dann:

def act(self):
    self.x += self.speed
    if self.x <= -self.width:
        self.reset()

Schritt 4: Schießen hinzufügen#

Erstelle die Bullet-Klasse:

class Bullet(Actor):
    def on_setup(self):
        self.add_costume("laserred")
        self.x = plane.x
        self.y = plane.y
        self.speed = 25
        self.fire = False
    
    def act(self):
        self.x += self.speed

    def on_detecting_enemy(self, enemy):
        enemy.reset()
        
    def on_detecting_not_on_world(self):
        self.remove()

Kompletter Beispielcode#