Pygame Zero

Einfache Softwarelösungen für verschiedene Probleme

Download .zip Download .tar.gz

Pygame Zero

Installation

Pygame Zero ist eine auf pygame aufbauende Bibliothek. Sie kann leicht mit pip installiert werden.

$ pip install pgzero

Danach steht das Kommandozeilentool pgzrun zur Verfügung, mit dem die Python-Dateien gestartet werden können.

Ein leeres Fenster

Eine leere Datei ist bereits ein Programm für PyGameZero. Man kann zusätzlich die Dimensionen des Fensters eingeben.

# demo.py
WIDTH = 300
HEIGHT = 300

Die Datei demo.py kann nun mit pgzrun ausgeführt werden.

pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Start ohne pgzrun

Alternativ kann ein Programm auch direkt über Python gestartet werden. Dazu muss das Modul pgzrun importiert und am Ende des Programms aufgerufen werden.


import pgzrun

WIDTH = 300
HEIGHT = 300

# run main gameloop
pgzrun.go()
python3 demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Gameloop

Eine gameloop einer Spiele-Engine ist nach dem folgenden Muster aufgebaut.

while game_has_not_ended():
    process_input()
    update()
    draw()

Und genau so funktioniert auch die Gameloop bei Pygame-Zero: Zunächst werden die Eingaben verarbeitet (process_input), dann die Spielwelt aktualisiert (update) und schließlich die veränderte Spielwelt gezeichnet (draw). Das passiert ca. 60 mal in der Sekunde.

Der Entwickler muss sich hauptsächlich um die Methoden update und draw kümmern, der Rest wird von der Engine übernommen.

Bilder

Ein Verzeichnis images enthält Bilder, die automatisch geladen werden.

file images/*
images/ball.gif: GIF image data, version 89a, 111 x 111

Nun wird ein Objekt von der Klasse Actor erstellt und mit einem Bild initialisiert. Jeder Actor hat eine Position (.x und .y), die nun in jedem Frame 60 mal pro Sekunde mit der Funktion update geändert wird. Danach wird die Methode draw aufgerufen, die die Spielwelt zeichnet.


ball = Actor("ball")  # create actor

def update():
    ball.x += 1  # move actor
    
def draw():
    ball.draw()  # draw actor 
pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Es entsteht ein unschöner “Ball-Streifen”. Um dies zu vermeiden, muss der Hintergrund zuvor immer gelöscht werden.


ball = Actor("ball")

def update():
    ball.x += 1

def draw():
    screen.fill((0,0,0))  # clear the screen
    ball.draw()
pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Interaktion mit der Maus

Schließlich können wir auch auf Mouseclicks reagieren. Dafür muss eine Methode on_mouse_down erstellt werden, die aufgerufen wird, sobald die Maus geklickt wird.


ball = Actor("ball")
direction = 1

def update():
    ball.x += direction

def draw():
    screen.fill((0,0,0))
    ball.draw()
    
def on_mouse_down(pos):  # handle mouse clicks
    global direction
    direction *= -1 # change direction on mouseclick
pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Sound

Sounds werde so ähnlich wie Bilder gehandhabt. Es muss ein Verzeichnis sounds existieren, in dem sich die Sounddateien (als WAV) befinden.


def on_mouse_down(pos):
    sounds.punch.play()  # play sounds/punch.wav

Der Sound sounds/punch.wav wird nun bei jedem Klick abgespielt.

pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Objekt-Orientierte Bälle

Nun soll das Programm objekt-orientiert mit einer Klasse umgesetzt werden. Das ermöglicht es uns, mit mehreren Bällen unabhängig umgehen zu können.


class Ball:  # Eine Klasse Ball mit verschiedenen Methoden
    def __init__(self, x, y):
        self.act = Actor("ball")
        self.act.x = x
        self.act.y = y
        self.direction = 1

    def draw(self):
        self.act.draw()
        
    def update(self):
        self.act.x += self.direction
        
    def clicked(self):
        self.direction *= -1

Wir erstellen ein paar Ball-Objekte und ergänzen Event-Methoden für die Bälle.


# creating some balls
balls = [Ball(0, 60), Ball(30, 180), Ball(60, 250)]

# event methods for all balls
def draw():
    screen.fill((0,0,0))
    for ball in balls: 
        ball.draw()
    
def update():
    for ball in balls:
        ball.update()
    
def on_mouse_down(pos):
    for ball in balls:
        ball.clicked()
pgzrun demo.py
pygame 1.9.4
Hello from the pygame community. https://www.pygame.org/contribute.html

Support für den Mu-Editor

Der Editor Mu besitzt einen eigenen Modus für Pygame-Zero-Spiele.

Weitere Informationen

Ein Cheat Sheet fasst die wichtigsten Aspekte zusammen.

Die beim Aufruf mit pgzrun verfügbaren Objekte sind in der Dokumentation im Abschnitt builtins beschrieben.