Zum Hauptinhalt springen
25h

Projekt Schneefall

Schneeflocken
Schneeflocken

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()
Zur Erinnerung

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).

Aufgabe 1 – Schneeflocke zeichnen
  1. Laden Sie eines der obigen Hintergrundbilder herunter und fügen Sie es im Mu-Editor bei den Bildern hinzu.

  2. Kopieren Sie die Vorlage für das Pygame Zero-Programm und legen Sie das gewählte Bild als Hintergrundbild fest.

  3. Passen Sie die Grösse des Fensters an, so dass das Bild optimal dargestellt wird. Es hat eine Auflösung von 1350x900 Pixel.

  4. Zeichnen Sie eine Schneeflocke an einer beliebigen Stelle.

SSR
Aufgabe 2 – 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.

  1. Erweitern Sie das Programm so, dass die x- und y-Koordinate der bestehenden Schneeflocke je in einer Liste gespeichert werden.

  2. Passen Sie die Codezeile zum Zeichnen der Schneeflocke so an, dass die Koordinaten der Schneeflocke aus der Liste geholt werden.

  3. Füge eine Zeile in die update()-Zeile ein, so dass die y-Koordinate stets verändert wird. Dabei müssen Sie das Schlüsselwort pass entfernen (es musste dort stehen, weil eine Funktion nicht leer sein darf).

Hinweis
  1. Erstellen Sie zu Beginn des Programms die Listen schnee_x und schnee_y und speichern Sie darin die Position der ersten Schneeflocke (z.B. schnee_x = [100]).

  2. Die Koordinaten stehen in beiden Listen an erster Stelle und haben somit Index 0 (schnee_x[0]).

SSR
Aufgabe 3 – 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.

  1. Legen Sie in einer Variablen fest, wie viele Schneeflocken Sie zeichnen möchten.

  2. 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.

  3. Fügen Sie eine weitere Schleife zum Zeichnen der Schneeflocken ein und passen Sie die x-Koordinate an.

  4. Probieren Sie das Programm aus. Was ist jetzt noch falsch, was müssen wir ebenfalls noch ändern?

Hinweis
  1. Normalerweise schreibt man Konstanten (also Variablen, deren Werte sich nicht ändern) in Grossbuchstaben.

  2. 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.

  3. Ersetzen Sie schnee_x[0] durch schnee_x[i], wobei i Ihre Schleifenvariable ist.

  4. Es gibt 2 Dinge zu korrigieren.

    1. 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.

    2. Zudem sollten diejenigen Schneeflocken, die unten am Bildrand ankommen, sofort wieder neu von oben kommen, sonst dauert der Schneefall nur kurz.

SSR
⭐ Zusatzaufgabe – Schneeflocken verschönern

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

SSR