Vorbereitung
👉 Mu Editor herunterladen, installieren und starten.
Pygame Zero
Wir wollen wieder etwas zeichnen mit Pygame Zero. Hier das Grundgerüst für ein Pygame Zero-Programm:
import pgzrun
TITLE = 'Fenstertitel'
WIDTH = 800
HEIGHT = 600
hintergrund = Actor('hintergrundbild')
def draw():
hintergrund.draw()
def update(zeitdifferenz):
# Anpassungen von Bild zu Bild
pass
pgzrun.go()
Bilder, die im Programm verwendet werden, müssen in einem Unterverzeichnis images
gespeichert sein. Anstelle von hintergrund
wird der Dateiname ohne Endung angegeben. Der Mu-Editor öffnet dieses Verzeichnis automatisch, wenn man auf Images
klickt.
Zeichnen mit Pygame Zero
In der draw()
-Funktion können nicht nur Actor
gezeichnet werden, es gibt auch die Möglichkeit, Linien, Rechtecke und Kreise zu zeichnen. Wir beschränken uns hier auf ausgefüllte Kreise, da wir Schneeflocken so darstellen möchten.
screen.draw.filled_circle(position, radius, farbe)
screen.draw.filled_circle([x, y], r, [r, g, b])
Dieser Aufruf zeichnet einen ausgefüllten Kreis mit Mittelpunkt [x, y]
und Radius r
in der Farbe [r, g, b]
(die Werte r
, g
und b
müssen zwischen 0
und 255
liegen). Wichtig ist, dass die zusätzlichen Klammern bei der Position und der Farbe geschrieben werden, da die Funktion nur 3 Werte erwartet: die Position, den Radius und die Farbe.
def draw():
hintergrund.draw()
screen.draw.filled_circle([100, 200], 10, [255, 0, 0])
Dies zeichnet einen rot gefüllten Kreis mit Radius 10 bei den Koordinaten (100, 200).
Laden Sie eines der obigen Hintergrundbilder herunter und fügen Sie es im Mu-Editor bei den Bildern hinzu.
Kopieren Sie die Vorlage für das Pygame Zero-Programm und legen Sie das gewählte Bild als Hintergrundbild fest.
Passen Sie die Grösse des Fensters an, so dass das Bild optimal dargestellt wird. Es hat eine Auflösung von
1350x900
Pixel.Zeichnen Sie eine Schneeflocke an einer beliebigen Stelle.
Damit wir die Schneeflocke bewegen können, muss die Position in einer Variablen gespeichert werden, damit sie in der update()
-Funktion verändert werden kann.
Später wollen wir dann 1'000 Schneeflocken darstellen und somit die Position von 1'000 Schneeflocken speichern. Dies lässt sich nicht mit separaten Variablen pro Schneeflocke realisieren. Listen eignen sich aber perfekt für diese Aufgabe.
Vorerst begnügen wir uns allerdings mit der einen Schneeflocke, die wir bereits haben. Anstatt aber die x- und y-Position als Zahl in einer Variablen zu speichern, verwenden wir bereits eine Liste.
Erweitern Sie das Programm so, dass die x- und y-Koordinate der bestehenden Schneeflocke je in einer Liste gespeichert werden.
Passen Sie die Codezeile zum Zeichnen der Schneeflocke so an, dass die Koordinaten der Schneeflocke aus der Liste geholt werden.
Füge eine Zeile in die
update()
-Zeile ein, so dass die y-Koordinate stets verändert wird. Dabei müssen Sie das Schlüsselwortpass
entfernen (es musste dort stehen, weil eine Funktion nicht leer sein darf).
Hinweis
Erstellen Sie zu Beginn des Programms die Listen
schnee_x
undschnee_y
und speichern Sie darin die Position der ersten Schneeflocke (z.B.schnee_x = [100]
).Die Koordinaten stehen in beiden Listen an erster Stelle und haben somit Index
0
(schnee_x[0]
).
Nun wollen wir mehrere Schneeflocken zeichnen. Dazu müssen wir brauchen wir Zufallszahlen als Startposition in der Liste mit den x-Koordinaten. Zudem müssen wir dafür sorgen, dass sämtliche Schneeflocken gezeichnet werden und nicht nicht eine.
Legen Sie in einer Variablen fest, wie viele Schneeflocken Sie zeichnen möchten.
Um die Liste mit den Startkoordinaten zu füllen, brauchen wir eine Schleife, die für sämtliche gewünschten Schneeflocken in einem sinnvollen Bereich eine Startkoordinate zufällig berechnet. Lassen Sie die Liste am Anfang leer und füllen Sie sie direkt anschliessend mit einer Schleife.
Fügen Sie eine weitere Schleife zum Zeichnen der Schneeflocken ein und passen Sie die x-Koordinate an.
Probieren Sie das Programm aus. Was ist jetzt noch falsch, was müssen wir ebenfalls noch ändern?
Hinweis
Normalerweise schreibt man Konstanten (also Variablen, deren Werte sich nicht ändern) in Grossbuchstaben.
Der sinnvolle Bereich für die x-Koordinate liegt zwischen
0
und der Breite des Fensters. Benutzen Sie die Variable und nicht die Zahl direkt.Ersetzen Sie
schnee_x[0]
durchschnee_x[i]
, wobeii
Ihre Schleifenvariable ist.Es gibt 2 Dinge zu korrigieren.
Auch die y-Koordinaten müssen am Anfang zufällig gesetzt, beim Zeichnen individuell verwendet und in der
update()
-Funktion individuell verändert werden, sonst kommt der Schnee als Linie herunter.Zudem sollten diejenigen Schneeflocken, die unten am Bildrand ankommen, sofort wieder neu von oben kommen, sonst dauert der Schneefall nur kurz.
Hier einige Ideen, wie Sie die Schneefall-Animation noch verbessern könnten:
Nicht alle Schneeflocken sollen gleich gross sein.
Die grösseren Flocken sollen schneller fallen (dies erzeugt einen leichten 3D-Effekt).
Die Schneeflocken, die neu von oben kommen, sollen eine neue zufällige x-Koordinate erhalten.
Die Schneeflocken vom Winde verweht werden
Projekt Schneefall