Zur Weihnachtszeit ein Projekt mit Schneegarantie!

Repetition Pygame Zero
Wir wollen wieder etwas zeichnen mit Pygame Zero. Hier das Grundgerüst für eine Pygame Zero-Programm:
import os
os.environ["SDL_VIDEO_WINDOW_POS"] = "100, 50"
import pgtrun
TITLE = "Fenstertitel"
WIDTH = 800
HEIGHT = 600
hintergrund = Actor("hintergrundbild")
def draw():
hintergrund.draw()
def update(zeitdifferenz):
# hier muss Code stehen, damit das Programm funktioniert
pgtrun.go()2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Da wir mit Thonny programmieren, muss Pygame Zero importiert (1. Zeile) und gestartet werden (letzte Zeile).
Damit Pygame Zero überhaupt verwendet werden kann, muss das Paket pgturbo installiert sein. Dazu öffnen wir im Menü Extras (engl. Tools) den Eintrag Verwalte Pakete… (engl. Manage Packages…), suchen nach pgturbo (falls mehrere Resultate auftauchen pgturbo anklicken) und klicken auf den Installieren-Knopf.
Zur Erinnerung
Bilder, die im Programm verwendet werden, müssen in einem Unterverzeichnis images gespeichert sein. Anstelle von hintergrundbild wird der Dateiname ohne Endung angegeben.
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))2
3
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))2
3
4
Dies zeichnet einen rot gefüllten Kreis mit Radius 10 bei den Koordinaten (100, 200).
Aufgaben
Aufgabe: Schneeflocke zeichnen
- Lade eines der folgenden Hintergrundbilder herunter. Erstelle einen Ordner
imagesdort, wo du die Python-Dateien speicherst und verschiebe das Hintergrundbild in diesen Order.
- Kopiere das Grundgerüst für das Pygame Zero-Programm und lege das gewählte Bild als Hintergrundbild fest.
- Passe die Grösse des Fensters an, so dass das Bild optimal dargestellt wird. Es hat eine Auflösung von
1350x900Pixel. - Zeichne eine Schneeflocke an einer beliebigen Stelle.
Lösung: Schneeflocke zeichnen (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: Schneeflocke bewegen
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.
- Passe das Programm so an, dass die x- und y-Koordinate der bestehenden Schneeflocke je in einer Liste gespeichert wird.
- Passe 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 musst du das Schlüsselwortpassentfernen, es musste dort stehen, weil eine Funktion nicht leer sein darf.
mehr
- Erstelle zu Beginn des Programms die Listen
schnee_xundschnee_yund speichere 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]).
Lösung: Schneeflocke bewegen (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.Aufgabe: mehrere Schneeflocken
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.
- Lege in einer Variablen fest, wie viele Schneeflocken du zeichnen möchtest.
- 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. Lasse die Liste am Anfang leer und fülle sie direkt anschliessend mit einer Schleife.
- Füge eine weitere Schleife zum Zeichnen der Schneeflocken ein und passe die x-Koordinate an.
- Probiere das Programm aus. Was ist jetzt noch falsch, was müssen wir ebenfalls noch ändern?
mehr
- Normalerweise schreibt man Konstanten (also Variablen, deren Wert sich nicht ändert) in Grossbuchstaben.
- Der sinnvolle Bereich für die x-Koordinate liegt zwischen
0und der Breite des Fensters. Benutze die Variable und nicht die Zahl direkt. - Ersetze
schnee_x[0]durchschnee_x[i], wobeiideine 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.
- Auch die y-Koordinaten müssen am Anfang zufällig gesetzt, beim Zeichnen individuell verwendet und in der
Lösung: mehrere Schneeflocken (nicht angemeldet)
Diese Lösung ist nur für angemeldete Benutzer zugänglich – wenn die LK die Lösung freigegeben hat. Bitte melde dich an, um die Lösung einsehen zu können.⭐ Zusatzaufgabe: Schneeflocken verschönern
Hier einige Ideen, wie du die Schneefall-Animation noch verbessern könntest:
- 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.

