====== Der Game-Loop ====== Der Game-Loop ist meistens eine ''while True:''-Schleife in der das Spiel läuft. Die Grundidee des Programms ist wie folgt: from oxocard import * from ivobuttons import * # Initialisierung aller Variablen, die den Zustand es Spiels beschreiben. # Initialisierung weiterer Dinge, wie z.B. der Beschleunigungssensor # Anzeige für Start des Spiel initialisieren while True: # Tasten etc. auslesen # Entscheiden, was für Aktionen nötig sind # Spielzustand aktualisieren, evtl. neu zeichnen Dabei ist es wichtig, dass jeder einzelne Durchlauf möglichst wenig Zeit in Anspruch nimmt, damit das Spiel sofort auf Benutzereingaben reagieren kann. Das obige gibt es auch noch als [[https://fginfo.ksbg.ch/~ivo/videos/informatik/python/oxocard-gameloop.mp4|Video]] und für Datenspender auch auf [[https://web.microsoftstream.com/video/3c3214a9-4024-4697-83f9-34e6606f07d2|Stream]]. ===== Animationen ===== Wenn es Dinge gibt, die über eine längere Zeit ablaufen, muss mit Zeitstempeln gearbeitet werden, z.B. so wird eine Aktion jede Sekunde einmal ausgeführt: letztens = getms() #Anzahl Millisekunden jetzt while True: jetzt = getms() if jetzt-letztens>1000: # Eine Sekunde ist vergangen, also ausführen letztens=jetzt # Aktion ausführen, Spielzustand aktualisieren Eine ausführlichere Erklärung mit minimalen Beispiel gibt es in diesem [[https://fginfo.ksbg.ch/~ivo/videos/informatik/python/oxocard-gameloop-animation-timer.mp4|Video]] und für Datenspender auf [[https://web.microsoftstream.com/video/3c3214a9-4024-4697-83f9-34e6606f07d2|Stream]]. ===== Kleines (Bei)Spiel ===== Studieren und testen Sie folgenden Code. from oxocard import * from ivobuttons import * from random import randrange # Funktion randrange importieren ivobuttons.delay=800 # Tasten erst nach 400ms repetieren repetieren beginnen ivobuttons.repeat_delay=400 # Tasten danach 5x pro Sekunde repetieren #Zustand vom Spiel # Koordinaten vom Spieler initialisieren x,y = 3,3 # Unterprogramm um die aktuelle Position zu loeschen. Wird erst aufgeführt, wenn unten aufgerufen def loeschen(): global x,y # Zugriff auf Variablen ausserhalb fastDot(x,y,BLACK) # Wird noch nicht angezeigt # Unterprogramm um die aktuelle Position zu zeichnen. def zeichnen(): global x,y fastDot(x,y,RED) fastRepaint() # Erst jetzt Änderungen sichtbar machen. fastDot(x,y,RED) fastRepaint() # Game loop while True: s = ivobuttons.states() if s & IVO_R2 and x<7: # Nur wenn nach rechts gegangen werden kann. loeschen() # Unterprogram loeschen ausführen x+=1 # Abkürzung für x=x+1 zeichnen() # Unterprogramm zeichnen ausführen if s & IVO_L2 and x>0: loeschen() x-=1 # Abkürzung für x=x-1 zeichnen() Zustand des Spiels: x-Kooordinate des Spielers Aktionen: Links, Rechts: Falls Verschiebung überhaupt möglich, wird der alte Punkte mit Schwarz überschrieben, die x-Koordinate angepasst und der Punkt neu gezeichnet. Bauen Sie das Spiel aus. Mögliche Varianten: * Der Benutzer kann auch nach oben und unten. * Der Benutzer kann damit zeichnen. * Ein weiterer Punkt fällt von oben nach unten. Dieser muss gefangen werden (oder ausgewichen). Dazu müssen Sie mit timern (getms()) arbeiten. * Mehrere Punkte fallen... * Die Steuerung erfolgt via Beschleunigungssensor und kippen der Karte. Siehe dazu https://www.tigerjython4kids.ch/index.php?inhalt_links=robotik/navigation.inc.php&inhalt_mitte=robotik/oxocard/sensor.inc.php