Winterwonderland

Im Folgenden programmieren wir eine Winterlandschaft, bei der du interaktiv Schneeflocken auffangen und Geschenke einsammeln kannst.

Die Schneeflocke

Um eine Schneeflocke als Grafik darzustellen verwenden wir die Klasse Sprite. Diese Grafikklasse besitzt bereits eine ganze Reihe von Attributen und Methoden, die wir nutzen können.

Öffne die Online-IDE und wähle den aktuellen Workspace aus. Deklariere eine Variable vom Typ Sprite, erzeuge ein Objekt der Klasse Sprite und weise es der Variable zu. Nutze als Grafikbibliothek die Bilddatei Winterwonderland mit dem Index 0 (Schneeflocke).
Teste die Methoden move, moveTo, scale, setAlpha und rotate,

Wir wollen nun eine eigene Klasse Schneeflocke programmieren. Dazu nutzen wir das Prinzip der Vererbung. Wir erweitern die Klassen Sprite und ergänzen sie um weitere Attribute, z. B. die Fallgeschwindigkeite vy. die von der Klasse Sprite erbt.
Diese Grafikklasse besitzt bereits eine ganze Reihe von Attributen und Methoden, die wir nutzen können.
Eine besondere Methode ist act(), die automatisch 30 Mal pro Sekunde aufgerufen wird. Der Alphawert zwischen 0 und 1 gibt an, wie transparent die Grafikf ist. Ein höherer Alphawert sorgt dafür, dass die Schneeflocke nicht weiß, sonder eher gräulich erscheint.

Ändere deinen bestehenden Quelltext und implementiere die Klasse Schneeflocke.
Schreibe einen Konstruktor für die Klasse. In diesem musst du zunächst mit super() den Konstruktor der Elternklasse Sprite aufrufen. Nutze den Konstruktor auch dazu die Größe und die Position der Schneeflocke gegeignet zu wählen und der Fallgeschwindigkeit vy den Wert 2 zuzuweisen.
Überschreibe die Methode act() und lasse die Schneeflocke damit langsam nach unten bewegen, indem du sie bei jedem Aufruf um vy nach unten bewegen lässt.
Teste dein Programm, indem du eine neue Schneeflocke erzeugst new Schneeflocke() erzeugst. So sollte es dann ungefähr ausschauen.

Eine einzige, immer an der gleichen Stelle fallende Schneeflocke ist doch recht langweilig. Wir brauchen viele, unterschiedlich große und schnelle Schneeflocken, die sich über den ganzen Bildschirm verteilen.
Im Konstruktor der Klasse Schneeflocke müssen wir die Werte für Größe, Position und Alphawert sowie Sinkgeschwindigkeit zufällig wählen. Dazu steht die Methode Random.randdouble(double from, double to) für zufällige Dezimalzahlen bzw. Random.randint(int from, int to) für zufällige Ganzzahlen zur Verfügung.

Verändere den Konstruktor der Klasse Schneeflocke so, dass die horizontale Anfangsposition, die Sinkgeschwindigkeit und der Alphawert zufällig gesetzt werden.
Teste dein Programm, indem du mit einer Wiederholung 100 Schneeflocke erzeugst.

So könnte es bei dir dann etwa schneien.

Beachte, dass die Anzahl der erzeugten Schneeflocken pro Zeit von der Ablaufgeschwindigkeit abhängen, die du mit dem Schieberegler einstellen kannst.

Aus unserer Animation wollen wir ein kleines Spiel machen, bei dem es darum geht, alle fallenden Schneeflocken durch einen Klick einzusammeln.

Wir überschreiben dazu die Methode onMouseDown() der Klasse Sprite

Diese Methode wird automatisch aufgerufen, wenn eine Schneeflocke angeklickt wird. Beim Aufruf der Methode kann man die Schneeflocke einfach mit dem Befehl destroy() zerstören und damit verschwinden lassen. Außerdem sollten die Schneeflocken auch zerstört werden, wenn sie sich außerhalb des unteren Rands des Zeichenfensters befinden. Die y-Position ist dann größer als 600.

Überschreibe die Methode onMouseDown() und verändere die Methode act(), so dass die Schneeflocke gelöscht wird, wenn wie angeklickt wird oder sich aus dem sichtbaren Bereich bewewegt.
Teste dein Programm.

Das kleine Spiel kann noch erweitert werden. Z. B. könnten auch von zufällig Geschenke oder Christbaumkugel vom Himmel fallen, die nicht angeklickt werden dürfen, weil sonst das Spiel vorüber ist (Methode ).

Programmiere eine Klasse Geschenk, die von der Klasse Sprite erbt und das beschriebene Verhalten hat.

Die fallenden Objekte wirken auch viel schöner, wenn sie sich während des Fluges drehen.

Ergänze ein Attribut für die Rotationsgeschwindigkeit v_rot, weise ihm im Konstruktor einen zufälligen Wert zu und nutze in der act()-Methode die Methode rotate(double winkel).