Zusammenfassung
In dieser Lektion hast du gelernt:
- Eine Koroutine ist eine Funktion, die mittendrin anhalten und später an derselben Stelle weitermachen kann, mit ihren lokalen Variablen. Spiele benutzen Koroutinen für Dinge, die mehrere Runden oder Frames dauern.
coroutine.create(f)macht aus der Funktionfeine Koroutine (keine Klammern nachf).coroutine.resume(co)führt sie bis zum nächstencoroutine.yield()oder zum Ende der Funktion aus. Eine Koroutine ist ein Wert des Typsthread, keine Funktion, deshalb scheitertco()mitattempt to call a thread value.coroutine.status(co)istsuspended(noch nicht gestartet oder angehalten),runningoderdead(beendet).coroutine.yield()außerhalb einer Koroutine, zum Beispiel in einer Funktion, die du selbst aufgerufen hast, endet mitattempt to yield from outside a coroutine.coroutine.yield(v)gibtvheraus:resumegibttrueundvzurück.coroutine.resume(co, x)gibtxhinein: das ersteresumean die Parameter der Funktion, jedes spätere als Ergebnis desyield, an dem die Koroutine wartet.- Eine
while true do-Schleife mit einemyielddarin ist nicht endlos: Sie hält bei jedemyieldan. coroutine.wrap(f)gibt einen Generator zurück: eine Funktion, die die Koroutine fortsetzt und nur die Werte ausyieldzurückgibt. Er passt infor … in, das aufhört, wenn die Funktion der Koroutine endet. Ein verbrauchter Generator kann nicht von vorn beginnen; mache einen neuen.- In einem Spiel kann jede Figur eine Koroutine mit ihrem Skript haben. Der Spielzyklus setzt jede davon einmal pro Runde fort. Sie kommen abwechselnd dran; sie laufen nie gleichzeitig.
- Ein Fehler in einer Koroutine stoppt nur die Koroutine:
resumegibtfalseund die Meldung zurück, und die Koroutine istdead. Eine tote Koroutine fortzusetzen ergibtfalseundcannot resume dead coroutine. Prüfe also den ersten Wert. Ein Generator auswrapreicht Fehler weiter, und das Programm stoppt.
In der nächsten Lektion, dem Abschlussprojekt, fügst du den ganzen Kurs zusammen: eine Saison auf Emmas Hof, ein Programm, das Schritt für Schritt entsteht, vom Kauf des Saatguts bis zum Verkauf der Ernte. Hugo, der Händler, ist natürlich auch dabei, als Koroutine.
Übe aber zuerst diese Lektion. Emma will gleich ihr Feld gießen; die Liste ihrer Beete steht im Editor.
So schreibst du es:
Anweisungen
- 1
Schreibe eine Funktion
durstigeBeete(beete), die einen mitcoroutine.wrapgemachten Generator zurückgibt. Der Generator gibt jedes Beet der Listebeeteab, dessenwassergrößer als0ist. Gehe mit einer Schleife überdurstigeBeete(feld)und gib für jedes Beet die Pflanze und das Wasser aus, so:Zu gießen: Karotten (2 l) Zu gießen: Kürbisse (3 l) Zu gießen: Kartoffeln (2 l) Zu gießen: Tomaten (1 l) - 2
Emmas Gießkanne ist eine Koroutine. Schreibe eine Funktion
giesskanne(liter)mit einer Schleife, die ewig läuft. In der Schleife gibt die Kanne ab, wie viele Liter sie enthält, und wartet darauf, wie viele ausgegossen werden sollen,local menge = coroutine.yield(liter), und gießt sie dann aus: Sie ziehtmengevonliterab. Mache daraus eine Koroutinekanne, starte sie mitcoroutine.resume(kanne, 6)und gib aus, wie viel sie enthält. Gehe dann mit einer Schleife über einen neuen GeneratordurstigeBeete(feld), setzekannemit demwasserjedes Beets fort und gib aus, was übrig ist. Unter der Liste aus Schritt 1 gibt das Programm aus (die letzten beiden Zeilen sind falsch; du behebst das im nächsten Schritt):Die Kanne enthält 6 l Karotten: 4 l übrig Kürbisse: 1 l übrig Kartoffeln: -1 l übrig Tomaten: -2 l übrig - 3
Eine Kanne kann nicht mehr Wasser ausgießen, als sie enthält. Wenn in
giesskannemengegrößer alsliterist, beende sie miterror("nicht genug Wasser", 0). Prüfe in der Schleife über die Beete, wasresumezurückgibt: Scheitert es, gib die Pflanze und die Meldung aus und beende die Schleife mitbreak. Gib nach der SchleifeEmma geht zum Brunnen.aus. Das ganze Programm gibt aus:Zu gießen: Karotten (2 l) Zu gießen: Kürbisse (3 l) Zu gießen: Kartoffeln (2 l) Zu gießen: Tomaten (1 l) Die Kanne enthält 6 l Karotten: 4 l übrig Kürbisse: 1 l übrig Kartoffeln: nicht genug Wasser Emma geht zum Brunnen.