Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:countdowns

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
scripting:tutorials:level2:countdowns [2023/11/30 09:37] – angelegt fritz_98scripting:tutorials:level2:countdowns [2024/02/10 16:57] (aktuell) fritz_98
Zeile 1: Zeile 1:
-=======Zähler und Zeitlimits======+======Zähler und Zeitlimits======
  
-  * Counter.SetLimit +Für manche Quests möchte man dem Spieler eine gewisse Zeit vorgeben, in der eine Aufgabe zu erledigen ist, zum Beispiel das Erreichen einer bestimmten Forschung oder das Errichten einer Verteidigung vor einem Angriff. Dazu sind Zähler/**Counter** notwendig, die beim Erreichen eines vorgegebenen Limits ein Ereignis auslösen
-  * Counter.Tick + 
-  * Counter.Reset +Die einfachste Variante davon, mit bereits bekannten Mitteln umgesetzt, sähe die Definition zweier globaler Variablen vor: Eine Zählvariable mit dem Startwert **0** und eine Limit-Variable **n**, die den Höchstwert für diesen Counter angibt. In einem ''SimpleJob'' soll diese Variable immer um 1 erhöht werden (also pro Sekunde 1 mal), sodass nach **n** Sekunden ein Ereignis ausgelöst werden kann: 
-  Counter.Tick2 +<code lua> 
-  MapLocal_StartCountDown +function MyCounterInit() 
-  * MapLocal_StopCountDown+    MyCounter = 0 
 +    MyCounterLimit = 240 
 +    StartSimpleJob("MyCounterCount"
 +end 
 + 
 +function MyCounterCount() 
 +    MyCounter = MyCounter + 1 
 +     
 +    if MyCounter >= MyCounterLimit then 
 +        -- Der Zähler wird zurückgesetzt 
 +        MyCounter = 0 
 +        -- hier geschehen Dinge 
 +        MyCounterEvent() 
 +        -- Job beenden 
 +        return true 
 +    end 
 +end 
 +</code> 
 + 
 +**Hinweis**: Wenn der Job beim Erreichen des Zählmaximums nicht beendet wird, wird das Ereignis wiederholt nach jeweils ''240'' Sekunden ausgelöst. 
 + 
 +Der Nachteil hierbei ist, dass jedes Mal zwei globale Variablen benötigt werden, über die man einen Überblick behalten muss. Deshalb gibt es bereits vorgefertigt ein ''Counter''-Modul, das das Zählen und Verwalten der Variablen übernimmt. 
 + 
 +Im ''Counter''-Modul hat jeder Counter einen Namen als String. Zum Setzen, Zählen und Abfragen des Counters wird nur dieser String und die folgenden Funktionen benötigt. 
 + 
 +\\ 
 + 
 +====Counter.SetLimit==== 
 + 
 +''Counter.SetLimit(_Name, _Limit)'' setzt das Limit ''_Limit'' in Sekunden für den Counter mit dem Namen ''_Name''
 + 
 +Im Beispiel oben entspricht das der Zeile 
 +<code lua> 
 +MyCounterLimit = 240 
 +</code> 
 +die sich damit durch die Zeile 
 +<code lua> 
 +Counter.SetLimit("MyCounter", 240) 
 +</code> 
 +ersetzen lässt. 
 + 
 +\\ 
 + 
 +====Counter.Tick==== 
 + 
 +''Counter.Tick(_Name)'' zählt den Counter mit dem Namen ''_Name'' um 1 nach oben. Wenn der Counter sein ''_Limit'' erreicht hat, wird er automatisch auf 0 zurückgesetzt und **true** zurückgegeben. Andernfalls gibt die Funktion **false** zurück. 
 + 
 +Im Beispiel oben entspricht das den Zeilen 
 +<code lua> 
 +MyCounter = MyCounter + 1 
 +if MyCounter >= MyCounterLimit then 
 +    MyCounter = 0 
 +</code> 
 +die sich damit durch die Zeile 
 +<code lua> 
 +if Counter.Tick("MyCounter") then 
 +</code> 
 +ersetzen lassen. 
 + 
 +\\ 
 + 
 +====Counter.Reset==== 
 + 
 +''Counter.Reset(_Name)'' setzt den Zählstand eines Counters mit dem Namen ''_Name'' auf 0 zurück. 
 + 
 +Im Beispiel oben entspricht das der Zeile 
 +<code lua> 
 +MyCounter = 0 
 +</code> 
 +die sich damit durch die Zeile 
 +<code lua> 
 +Counter.Reset("MyCounter"
 +</code> 
 +ersetzen lässt. 
 + 
 +\\ 
 + 
 +====Counter.Tick2==== 
 + 
 +''Counter.Tick2(_Name, _Limit)'' vereint die Funktion von ''Counter.SetLimit'' und ''Counter.Tick''. Das heißt, dass sowohl ein neuer Counter mit dem Namen ''_Name'' und dem Limit ''_Limit'' initialisiert als auch hochgezählt wird. Weil diese Schreibweise so kurz ist, wird sie auch bevorzugt verwendet. 
 + 
 +Mit ''Counter.Tick2'' wird das Counter-Beispiel oben stark verkürzt: 
 +<code lua> 
 +function MyCounterInit() 
 +    StartSimpleJob("MyCounterCount"
 +end 
 + 
 +function MyCounterCount() 
 +    -- Erstelle einen neuen Counter, setze das Limit fest und zähle ihn jede Sekunde hoch 
 +    if Counter.Tick2("MyCounter", 240) then 
 +        -- hier geschehen Dinge 
 +        MyCounterEvent() 
 +        -- Job beenden 
 +        return true 
 +    end 
 +end 
 +</code> 
 +---- 
 + 
 +====Zeitanzeige am Rand des Bildschirms==== 
 + 
 +Die Counter, die in den Abschnitten oben betrachtet werden, sind nur für das Skript sichtbar. Manchmal möchte man dem Spieler einen solchen Counter auch anzeigen, beispielsweise um einen nahenden Angriff genau zu datieren. Dazu gibt es die Funktion ''MapLocal_StartCountDown(_Time)''. Der Parameter ''_Time'' gibt in Sekunden an, wie lange der anzuzeigende Countdown ist. Sobald er komplett runtergezählt hat, verschwindet er wieder. Wenn du die Funktion erneut aufrufst, bevor der alte Countdown fertig ist, wird nur der neue Countdown angezeigt. 
 + 
 +**Achtung**: Die Funktion ist nur dazu da, einen Countdown anzuzeigen. Es wird dadurch **nicht** ein Ereignis ausgelöst. Das Ereignis muss an einer anderen Stelle im Skript am Ende eines Counters gesondert ausgelöst werden. 
 + 
 +Um die Anzeige des Countdowns frühzeitig zu entfernen, kann ''MapLocal_StopCountDown()'' aufgerufen werden. 
 + 
 +---- 
 + 
 +Im nächsten Kapitel beschreiben wir, wie im Kontrast zu den [[ scripting:tutorials:level1:enemy_ai#mapeditor_setupai|in Ebene 1 gezeigten einfachen Computergegnern]] maßgeschneiderte Spawner mit wahlweise defensivem oder aggressivem Verhalten definiert werden können. 
 + 
 + 
 +[[ scripting:tutorials:level2:mercenaries | Voriges Kapitel: Söldnerquartiere ]] \\ 
 +[[ scripting:tutorials:level2:bandit_camps | Nächstes Kapitel: Banditenlager und Spawner ]] \\ 
 +[[ scripting:tutorials:level2:countdowns | Zurück nach oben ]]
scripting/tutorials/level2/countdowns.1701337031.txt.gz · Zuletzt geändert: 2023/11/30 09:37 von fritz_98