lehrkraefte:blc:informatik:glf20:gameloop

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 Video und für Datenspender auch auf Stream.

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 Video und für Datenspender auf Stream.

Studieren und testen Sie folgenden Code.

game0.py

game0.py

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()
 

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:

  • lehrkraefte/blc/informatik/glf20/gameloop.txt
  • Last modified: 2020/12/11 07:34
  • by Ivo Blöchliger