lehrkraefte:blc:informatik:glf20:gameloop

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:glf20:gameloop [2020/12/07 12:49] Ivo Blöchligerlehrkraefte:blc:informatik:glf20:gameloop [2020/12/11 06:34] (current) – [Animationen] Ivo Blöchliger
Line 1: Line 1:
 +====== 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>