====== Spieleprogrammierung in Jgst. 9 ======
Der bayerische Lehrplan der Jahrgangsstufe 9 sieht noch keine Objektreferenzen in Attributen vor. Dies schränkt die Programmierung umfangreicherer Spiele deutlich ein, mit etwas Geschick kann man aber doch zu ansprechenden Ergebnissen kommen. \\
**Strategien:**
* Verwendung der **Processing-API**: Die Hauptklasse des Programms erbt von der Klasse ''PAppplet'' und überschreibt deren Methoden ''setup'' (wird 1-mal zu Beginn aufgerufen) und ''draw'' (wird anschließend 30-mal pro Sekunde aufgerufen). Bei jedem Aufruf von ''draw'' wird der Zeichenbereich gelöscht und muss komplett neu gezeichnet werden. Es gibt keine Klassen für graphische Objekte, sondern nur Zeichen-Methoden der Klasse ''PApplet'' wie ''circle'', ''rectangle'' usw. **Der Zustand des Programms kann daher komplett in Attributen mit primitiven Datentypen gespeichert werden.** Beispiele dafür finden Sie im Klett-Buch, zudem [[https://www.learnj.de/doku.php?id=api:documentation:processing:start|hier eine Einführung in die Processin-Programierung mit der Online-IDE]]. \\ \\
* Verwendung der **Graphics and Games-API des Cornelsen-Verlages**: Zentraler Angelpunkt ist hier die Klasse ''Figur''. Erbt man von ihr, so kann man durch Überschreiben der Methoden ''AktionAusführen'' (wird 30-mal pro Sekunde aufgerufen) die Figur animieren und durch Überschreiben der Methoden ''TasteGedrückt'' und ''MausGeklickt'' auf Tastatur- und Mauseingaben reagieren. Die Interaktion mit anderen graphischen Objekten geschieht über die Methoden ''Berührt()'' und ''Berührt(String farbe)''. Sie geben genau dann true zurück, wenn die Figur irgendein graphisches Objekt berührt bzw. eines mit der angegebenen Farbe. [[https://www.learnj.de/doku.php?id=api:documentation:gng:start|Hier eine Beschreibung, wie sich die Graphics and Games-API in der Online-IDE nutzen lässt.]] \\ \\
* Verwendung von **[[https://greenfoot.org/door|Greenfoot]]**: Jedes graphische Objekt besitzt eine Methode act, die 60-mal pro Sekunde aufgerufen wird, sowie Methoden zur Abfrage von Tastatur und Maus (''isKeyDown'', ''isKeyUp'', ...). Diese Ideen haben die graphischen Klassen der Online-IDE übernommen, sie sind aber deutlich umfangreicher als die Pendants in Greenfoot und nicht vollständig kompatibel. \\ \\
* Verwendung der **Graphik-API der Online-IDE**: Jede graphische Klasse erbt von der Klasse ''Actor''. Sie besitzt eine überschreibbare Methode ''act'', die 30-mal pro Sekunde aufgerufen wird sowie Methoden ''onKeyDown'', ''onMouseMove'', usw. zum Reagieren auf Tastatur- und Mausereignisse. Zudem lässt sich der Status der Tasten auch mit ''isKeyDown(String taste)'' jederzeit abfragen. Die Interaktion mit anderen graphischen Objekten gelingt mit der Methode ''collidesWithAnyShape()'', die genau dann true zurückgibt, wenn das graphische Objekt ein anderes berührt.
{{:g9:uebungen:pasted:20220630-092311.png}}
===== Verwendung der Grafikklassen der Online-IDE =====
==== 1. Spiel "Spacejunk" von Jochen Schmitt (Gymnasium Veitshöchheim) ====
Auf der Seite [[https://info-am-gym.de/java/spacejunk.html|https://info-am-gym.de/java/spacejunk.html]] zeigt Herr Schmitt seinen Schülerinnen und Schülern in vielen kleinen, liebevoll und detailreich beschriebenen Schritten, wie sie selbst ein kleines Multiplayer-Spiel programmieren können. Nach jedem größeren Schritt kann man den aktuellen Stand des Spiels ausprobieren und selbst verändern. Zudem gibt es immer wieder kleine interaktive Tests, mit denen die Schülerinnen und Schüler ihren Lernfortschritt überprüfen können. \\
Sehr sehenswert!
==== 2. Pong ====
Die Klassen Ball und Schläger stehen in keiner Beziehung zueinander: Der Ball erkennt mit der Methode ''collidesWithAnyShape'', ob er mit einem der beiden Schläger zusammenprallt, an der y-Koordinate, ob er den oberen/unteren Rand berührt und an der x-Koordinate, ob ein Tor geschossen wurde.
==== 3. Hunter Game ====
Die Idee zu diesem Spiel kommt von Frau Dr. Siglinde Voss. Ein ähnliches Spiel auf Basis des Processing Frameworks findet sich im Klett-Buch.
\\ \\
Wie im Beispiel Pong oben haben auch hier die Klassen ''Hunter'', ''Prey'' und ''Bomb'' keine Beziehung zueinander. Sowohl die ''Prey''-Objekte als auch die ''Bomb''-Objekte erkennen mit der Methode ''collidesWithAnyShape()'', ob sie mit dem ''Hunter''-Objekt kollidieren. Das ''Prey''-Objekt zählt ggf. den Punktestand hoch und erzeugt neue ''Bomb''-Objekte. \\
Das ganze funktioniert natürlich nur, wenn das Prey-Objekt und die Bomben nur dorthin gesetzt werden wo noch nichts liegt. Dies wird durch die Methode ''moveToRandomLocation'' in beiden Klassen bewirkt.