Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:verzoegerte_aktionen

Verzögerte Aktionen / Delay - Funktionen

Normalerweise werden alle Aktionen in einer Scriptfunktion sofort nacheinander ausgeführt. Möchte man einige Dinge erst nach ein paar Sekunden erledigen, braucht man dazu normalerweise einen Job.

Mit den nun von mir geschrieben Zusatzfunktionen, kann man einfach mitten in einer Funktion eine Pause einlegen. Dadurch kann man Sequenzen von Aktionen ganz bequem nacheinanderschreiben, ohne dazu einen Job & Zähler starten zu müssen.

Eine Delay Funktion muß Du dir vorstellen, wie ein Kind, daß Du losschickst etwas einzukaufen. Du (das Hauptprogramm) muß ja nicht warten bis das Kind zurückkommt. Du kannst fernsehen, eine rauchen, Dein Kind mach das nebenher. Und wenn Du viele Kinder hast kannst diese alle mit etwas anderem beschäftigen. Deine Kinder aber, wenn die auch Kinder haben, sind nicht so unhöflich wie Du, die warten.

Beispiel:

function Sequenz1()
	Message( "Diese Nachricht kommt sofort" );
	Delay( 5 );
	Message( "Diese hier kommt 5 Sekunden später" );
end

Hier wird die zweite Nachricht um 5 Sekunden verzögert angezeigt.
Die funktioniert allerdings nur, wenn man Sequenz1 nicht normal aufruft, sondern über StartDelayFunc() startet, und zwar so:

StartDelayFunc( Sequenz1 )

Im Gegensatz zu normalen Jobs werden hier keine Anführungszeichen verwendet. Wenn man Delay() verwendet, ohne die entsprechende Funktion mit StartDelayFunc() gestartet zu haben, erhält man diese Fehlermeldung:

Error: LUA_ERRRUN: attempt to yield across metamethod/C-call boundary

Man kann die Ausführung auch um Sekundenbruchteile verzögern. Diese Zeile verzögert die Ausführung um 3 Zehntelsekunden.

DelayShort( 3 );

Es ist sogar möglich, Parameter an die Funktionen zu übergeben:

function Sequenz2( _time, _msg )
	Delay( _time );
	Message( _msg );
end
 
StartDelayFunc( Sequenz2, 3, "Test 123" );

Hier werden die Paramter „3“ und „Test 123“ and die Funktion Sequenz2 übergeben. Da _time nun 3 ist, wird zunächst 3 Sekunden gewartet, und dann die Nachricht _msg bzw „Test 123“ ausgegeben.

Da diese Funktionen bisher nicht im Spiel existieren, muss dieser Code am Ende des eigenen Scriptes eingefügt werden.

Hier gibt es noch eine kleine Beispielkarte.

Achtung:
Aufgrund eines Fehlers in der Engine , treten Probleme auf, wenn man einen (Simple)Job oder ein Briefing aus einer DelayFunc heraus startet.
Es gibt allerdings einen Workaround.

Dieser Code wird Probleme verursachen:

StartDelayFunc( VerzoegertesBriefing )
 
...
 
function VerzoegertesBriefing()
	Delay( 5 );
	CreateBriefingTest();
end

Man kann ihn aber so umschreiben, damit er fehlerfrei funktioniert:

StartDelayFunc( VerzoegertesBriefing )
 
...
 
function VerzoegertesBriefing()
 	Delay( 5 );
 	return CreateBriefingTest;
end

Man kann also per „return“ eine Funktion zurückgeben.
Diese wird dann sofort korrekt ausgeführt.

Es ist auch möglich, eine beliebige Anzahl Argumente zu übergeben, schreibt man z.B:

return Message, "test"

dann wird anschliessend Message( „test“ ) aufgerufen.

Während eine Delay-Funktion läuft, kann im Spiel nicht gespeichert werden.

Dies diese Einschränkung ist aufgrund des nicht vollständigen Speichercodes notwendig. Daher sollten diese Funktionen nur während eines Briefings, oder für kurze, einmalige, Handlungsabläufe verwendet werden, da dem Spieler ansonsten die Speichermöglichkeit genommen wird.

Für längere, zeitgesteuerte Aktionen kann man einen unsichtbaren Countdown verwenden.

Zur Tutorial-Übersicht

tutorials/verzoegerte_aktionen.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)