Skripte für Figuren
Jetzt zu dem, wofür Spiele Koroutinen am meisten benutzen: Skripte für Figuren. Jede Figur bekommt eine Koroutine, die beschreibt, was sie tut, von Anfang bis Ende, Zug für Zug. Das Spiel läuft in Runden (auf unserem Hof ist eine Runde ein Tag): In jeder Runde setzt es die Koroutine jeder Figur einmal fort, und jede Figur macht einen Schritt und gibt ab.
Hugo, der Händler, hat eine Route mit drei Stationen. Die Kuh Bella hat alle zwei Tage dieselbe Routine, ihr Skript ist also eine Schleife, die nie endet:
-- Wer auf dem Sonnenblumenhof was tut
local function hugo()
print("Hugo ist auf dem Markt.")
coroutine.yield()
print("Hugo besucht den Sonnenblumenhof.")
coroutine.yield()
print("Hugo reist in die Stadt.")
end
local function bella()
while true do
print("Bella grast auf der Weide.")
coroutine.yield()
print("Bella ruht sich in der Scheune aus.")
coroutine.yield()
end
end
local figuren = {coroutine.create(hugo), coroutine.create(bella)}
for tag = 1, 4 do
print("Tag " .. tag)
for _, figur in ipairs(figuren) do
if coroutine.status(figur) ~= "dead" then
coroutine.resume(figur)
end
end
endDas gibt Folgendes aus:
Tag 1
Hugo ist auf dem Markt.
Bella grast auf der Weide.
Tag 2
Hugo besucht den Sonnenblumenhof.
Bella ruht sich in der Scheune aus.
Tag 3
Hugo reist in die Stadt.
Bella grast auf der Weide.
Tag 4
Bella ruht sich in der Scheune aus.Die Koroutinen stehen in einer Liste, der Spielzyklus kümmert sich also nicht darum, wie viele Figuren es gibt: Er gibt jeder von ihnen ihren Zug, in der Reihenfolge der Liste. Die Figuren kommen abwechselnd dran; sie laufen nie gleichzeitig. Jede läuft bis zu ihrem yield, und erst dann ist die nächste dran. An Tag 4 ist Hugos Skript schon zu Ende (dead), die Schleife überspringt ihn also.
Warum Koroutinen? Ohne sie bräuchte Hugo eine Variable, die sich seinen Schritt merkt, und jeden Tag ein if schritt == 1 then … elseif schritt == 2 then …, und jede Figur bräuchte eigene solche Variablen. Eine Koroutine merkt sich, wo sie angehalten hat, und ihre lokalen Variablen auch, sodass jedes Skript von oben nach unten gelesen wird wie eine Geschichte: zuerst das, dann warten, dann das. Bellas Skript zeigt es: eine Schleife mit zwei Schritten, mehr nicht.
So schreibst du es:
Anweisungen
- 1
Der Hund Rex bringt Emma jeden Tag einen Stock und zählt sie. Schreibe eine Funktion
rexfür sein Skript: eine lokale Variablestoecke, die bei0beginnt, dann eine Schleife, die ewig läuft. In der Schleife fügt Rex einen Stock hinzu, gibtRex bringt Stock Nummer 1.aus (mit der aktuellen Nummer) und gibt ab. Mache ausrexeine Koroutine und setze sie jeden Tag fort, direkt nach Hugo. Das Programm gibt aus:Tag 1 Hugo verkauft Saatgut auf dem Markt. Rex bringt Stock Nummer 1. Tag 2 Hugo kauft Eier auf dem Sonnenblumenhof. Rex bringt Stock Nummer 2. Tag 3 Hugo fährt in die Stadt. Rex bringt Stock Nummer 3. - 2
Opa Josef, der Nachbar, kommt jeden zweiten Tag auf einen Schwatz vorbei: an Tag 2, 4, 6 und so weiter. Schreibe sein Skript,
opaJosef: In einer Schleife, die ewig läuft, lässt er zuerst einen Tag vergehen (nurcoroutine.yield()), gibt dannOpa Josef kommt auf einen Schwatz vorbei.aus und gibt wieder ab. Lege die drei Koroutinen in eine Listefiguren, in der Reihenfolge Hugo, Rex, Opa Josef, und setze in einer Schleife mitipairsjede fort, die nichtdeadist. Lass das Spiel vier Tage lang laufen. Das Programm gibt aus:Tag 1 Hugo verkauft Saatgut auf dem Markt. Rex bringt Stock Nummer 1. Tag 2 Hugo kauft Eier auf dem Sonnenblumenhof. Rex bringt Stock Nummer 2. Opa Josef kommt auf einen Schwatz vorbei. Tag 3 Hugo fährt in die Stadt. Rex bringt Stock Nummer 3. Tag 4 Rex bringt Stock Nummer 4. Opa Josef kommt auf einen Schwatz vorbei.