image image


image

Spieleprogrammierung mit Pygame Zero: Der rote Baron Stage 1

Meine Erkundungen von Pygame Zero als mögliche Basis für mein geplantes Projekt »Retrogaming und Künstliche Intelligenz« gehen weiter. Zuletzt hatte ich mich ja an einem endlos scrollenden Hintergrund versucht und dies habe ich nun weiter ausgebaut: Ich habe dem Prototypen zusätzlich Parallax-Scrolling spendiert.

Darunter versteht man die optische Tiefenwirkung, die entsteht, wenn sich Objekte im Vordergrund schneller bewegen, als Objekte im Hintergrund. Ich habe das mit einem sehr einfachen Beispiel implementiert, in dem der Hintergrund mit einer Geschwindigeit von 0.4 Einheiten und der Vordergrund mit einer Geschwindigkeit von 0.6 Einheiten am Betrachter vorbeizieht:

BACKGROUND = "background"
GROUND     = "groundgrass"

back0 = Actor(BACKGROUND, (left, bottom))
back1 = Actor(BACKGROUND, (WIDTH + left, bottom))
backs = [back0, back1]
ground0 = Actor(GROUND, (left, bottomground))
ground1 = Actor(GROUND, (WIDTH + left, bottomground))
grounds = [ground0, ground1]

# […]

def update():
    for back in backs:
        back.x -= 0.4
        if back.x <= -left:
            back.x = WIDTH + left
    for ground in grounds:
        ground.x -= 0.6
        if ground.x <= -left:
            ground.x = WIDTH + left

Natürlich kann man das am Screenshot nur erahnen, aber wenn das Programm läuft, entsteht tatsächlich im Auge des Betrachters der Eindruck einer räumlichen Tiefe. Verstärkt wird dieser auch noch durch den kleinen, roten Doppeldecker mit seinem rotierenden Propeller, der zwar eigentlich an einer festen Bildschirmposition verharrt, aber durch den bewegenden Vorder- und Hintergrund den Eindruck erweckt, als würde er über die Landschaft gleiten.

Das Programm ist eine Vorstudie zu einem Spiel mit dem Arbeitstitel »Der rote Baron und die bunten Blasen«, in dem der Spieler als Pilot des Doppeldeckers (eben als der Rote Baron) bunten Blasen ausweichen und diese abschießen muß. Also so etwas wie eine Mischung aus »Flappy Bird« und einem Side Scrolling Shooter.

Für diejenigen, die mir bei meinen Experimenten folgen wollen, hier der (bisher) komplette Quellcode, den es natürlich auch – wie immer – mit sämtlichen Assets in meinem GitHub-Repositorium gibt.

import pgzrun
import sys

WIDTH = 800
HEIGHT = 480
TITLE = "The Red Baron 1"
left = WIDTH/2
bottom = HEIGHT/2
bottomground = HEIGHT - 35

BACKGROUND = "background"
GROUND     = "groundgrass"

back0 = Actor(BACKGROUND, (left, bottom))
back1 = Actor(BACKGROUND, (WIDTH + left, bottom))
backs = [back0, back1]
ground0 = Actor(GROUND, (left, bottomground))
ground1 = Actor(GROUND, (WIDTH + left, bottomground))
grounds = [ground0, ground1]

plane = Actor("planered1", (100, HEIGHT//2))
plane.count = 0

def update():
    for back in backs:
        back.x -= 0.4
        if back.x <= -left:
            back.x = WIDTH + left
    for ground in grounds:
        ground.x -= 0.6
        if ground.x <= -left:
            ground.x = WIDTH + left
    plane.count += 1
    if plane.count > 9: plane.count = 0
    if plane.count < 3:
        plane.image = "planered1"
    elif plane.count < 6:
        plane.image = "planered2"
    else:
        plane.image = "planered3"

def draw():
    for back in backs:
        back.draw()
    for ground in grounds:
        ground.draw()
    plane.draw()

def on_key_down():
    ## Spielende mit ESC
    if keyboard.escape:
        sys.exit()
        
pgzrun.go()

Die Bilder entstammen wieder dem unerschöpflichen und freien (CC0) Fundes der Spieleschmiede Kelly, die dafür auch einmal (m)einen Dank verdient haben.


1 (Email-) Kommentar


anbei ein kleiner Hinweis, warum dein Hintergrund etwas ruckelt:
Wenn du dir dieses Tutorial anschaust: https://www.pygame.org/docs/tut/newbieguide.html - Dann findest du eine Technik die man in pygame normalerweise anwendet um die Performance stark zu erhöhen: Mit Hilfe von Dirtysprites zeichnet man nur die Teile des Bildschirms neu, die sich nicht verändert haben - Wenn du einen Sidescroller programmierst, funktioniert das natürlich nicht mehr und da stößt pygame an seine Grenzen:
"There are two cases where this technique just won’t work. The first is where the whole window or screen really is being updated every frame – think of a smooth-scrolling engine like an overhead real-time strategy game or a side-scroller. So what do you do in this case? Well, the short answer is – don’t write this kind of game in pygame. The long answer is to scroll in steps of several pixels at a time; don’t try to make scrolling perfectly smooth. Your player will appreciate a game that scrolls quickly, and won’t notice the background jumping along too much."

– Andreas S. (Kommentieren) (#)


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image