Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:glf20:gameloop [2020/12/07 12:58] – Ivo Blöchliger | lehrkraefte: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 '' | ||
| + | <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, | ||
| + | # Spielzustand aktualisieren, | ||
| + | |||
| + | </ | ||
| + | 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:// | ||
| + | |||
| + | ===== 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() | ||
| + | while True: | ||
| + | jetzt = getms() | ||
| + | if jetzt-letztens> | ||
| + | letztens=jetzt | ||
| + | # Aktion ausführen, Spielzustand aktualisieren | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Eine ausführlichere Erklärung mit minimalen Beispiel gibt es in diesem [[https:// | ||
| + | und für Datenspender auf [[https:// | ||
| + | |||
| + | ===== 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 | ||
| + | |||
| + | ivobuttons.delay=800 | ||
| + | ivobuttons.repeat_delay=400 | ||
| + | |||
| + | #Zustand vom Spiel | ||
| + | # Koordinaten vom Spieler initialisieren | ||
| + | x,y = 3,3 | ||
| + | |||
| + | # Unterprogramm um die aktuelle Position zu loeschen. Wird erst aufgeführt, | ||
| + | def loeschen(): | ||
| + | global x,y # Zugriff auf Variablen ausserhalb | ||
| + | fastDot(x, | ||
| + | |||
| + | # Unterprogramm um die aktuelle Position zu zeichnen. | ||
| + | def zeichnen(): | ||
| + | global x,y | ||
| + | fastDot(x, | ||
| + | fastRepaint() | ||
| + | |||
| + | fastDot(x, | ||
| + | fastRepaint() | ||
| + | |||
| + | # Game loop | ||
| + | while True: | ||
| + | s = ivobuttons.states() | ||
| + | if s & IVO_R2 and x< | ||
| + | loeschen() | ||
| + | x+=1 # Abkürzung für x=x+1 | ||
| + | zeichnen() | ||
| + | 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, | ||
| + | </ | ||
| + | |||
| + | |||
| + | <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:// | ||
| + | </ | ||