Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== 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: <code python> 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 </code> 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: <code python> 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 </code> 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 ===== <WRAP todo> Studieren und testen Sie folgenden Code. <hidden game0.py> <code python game0.py> 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() </code> </hidden> 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. </WRAP> <WRAP todo> 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 </WRAP> lehrkraefte/blc/informatik/glf20/gameloop.txt Last modified: 2020/12/11 07:34by Ivo Blöchliger