Zum Hauptinhalt springen

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
👉 Winterlandschaft 1
👉 Winterlandschaft 1@
👉 Winterlandschaft 2
👉 Winterlandschaft 2@
  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