image image


image

Pygame Zero Tutorial: Endlos gleitet der Hintergrund vorbei …

Das Bild letzten Freitag von dem »Simple Shooter« hatte mich inspiriert. Irgendetwas in der Art – weniger als Shooter, aber mit vielen bunten Punkten, denen der Spieler ausweichen muß – möchte ich auch gerne einmal programmieren. Aber nicht unbedingt mit Pythons Schildkröte, sondern mit Pygame Zero, weil ja für mein geplantes Projekt »Retrogaming und Künstliche Intelligenz« die Erkundung von Pygame Zero eh auf meinem Programm steht.

So habe ich als erste Fingerübung einen endlos scrollenden Hintergrund implementiert. Das ist real kein »endlos« scrollender Hintergrund, sondern ein sich ständig wiederholendes Hintergrundbild: Alles. was am linken Bildrand verschwindet, wird rechts wieder neu eingeblendet.

Für die Implementierung braucht man zwei Instanzen des gleichen Bildes (man kann auch mehrere Bilder nehmen, Voraussetzung ist, daß sie an den Rändern nahtlos ineinander übergehen). Ich habe sie back0 und back1 und in eine Liste backs[] gesteckt. Das Script erledigte dann den Scrollvorgang in wenigen Zeilen:

def update():
    for back in backs:
        back.x -= 0.5   # < 0.4 ruckelt das Bild
        if back.x <= -left:
            back.x = WIDTH + left

Schon gleitet der Hintergrund majestätisch am Spieler vorbei. Um den Eindruck der Bewegung zu verstärken, habe ich dem Spiel auch noch eine Spielfigur (walker) verpaßt, die mit zappelnden Beinen auf der Stelle verharrt. Doch weil der Hintergrund an ihr vorbeizieht, entsteht der Einduck, als würde der walker sich vorwärts bewegen. Das Zappeln der Beine habe ich – ebenfalls in der update()-Methode mit zwei periodisch ausgetauschten Bildern realisiert:

    walker.count += walker.speed
    if walker.count > 20: walker.count = 0
    if walker.count < 11:
        walker.image = "walk1"
    else:
        walker.image = "walk2"

Das gesamte Script ist extrem kompakt geraten. Einschließlich der Sonderbehandlung für die ESCAPE-Taste besteht es gerade einmal aus 42 Zeilen Python:

import pgzrun
import sys

WIDTH = 800
HEIGHT = 400
TITLE = "Scrolling Background 2 (mit Spaziergänger)"
left = WIDTH/2
bottom = HEIGHT/2

BACKGROUND = "desertback"

back0 = Actor(BACKGROUND, (left, bottom))
back1 = Actor(BACKGROUND, (WIDTH + left, bottom))
backs = [back0, back1]

walker = Actor("walk1", (100, HEIGHT - 100))
walker.speed = 1
walker.count = 0

def update():
    for back in backs:
        back.x -= 0.5   # < 0.4 ruckelt das Bild
        if back.x <= -left:
            back.x = WIDTH + left
    walker.count += walker.speed
    if walker.count > 20: walker.count = 0
    if walker.count < 11:
        walker.image = "walk1"
    else:
        walker.image = "walk2"

def draw():
    for back in backs:
        back.draw()
    walker.draw()

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

Zwei Dingen möchte ich noch genauer auf den Grund gehen:

  1. Ob und wann es sinnvoll ist, Spielcharactere in einer eigener, von Actor() abgeleiteten Klasse zu behandeln, habe ich für mich noch nicht endgültig entschieden. Eigene Eigenschaften kann man ihnen (wie im obigen Fall für walker.speed und walker.count) auch als Actor() zuweisen, notwendig scheint es also erst zu sein, wenn man die update()- oder draw()-Methode überschreiben muß oder wenn eigene Methoden der Übersicht oder besseren Lesbarkeit dienen.
  2. Wenn man die Zeitschritte zu klein wählt – in diesem Beispiel mit back.x < 0.4 ruckelt das Bild. Hier sollte ich noch ausprobieren, ob Pygame Zeros eingebaute Animation-Methode eine Verbesserung bringt.

Das Hintergrundbild habe ich dem freien Tileset (CC0) von Dylan Squires auf OpenGameArt.org entnommen und das Bild des Spielers entstammt wieder dem unerschöpflichen Fundus freier Sprites von Kenney.nl. Und den Quellcode und die Assets gibt es natürlich auch wieder in meinem GitHub-Repositorium.


(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