Jobs
Aus PantheonWiki
Jobs
Jobs sind atomare unabhängie Ausführungseinheiten, die einzelne Aktionen kapseln. Was so abstrakt klingt, wird am Beispiel schnell einleuchtend:
- Einen Sound abspielen
- Eine Animation abspielen
- Einen NSC von A nach B laufen lassen
Der große Vorteil von Jobs ist, dass sie nicht sofort ausgeführt werden müssen, sondern verzögert werden können und dass man sie parallel und/oder nacheinander anordnen kann. Damit kann man einfach Sequenzen von Aktionen zusammenfassen und gemeinsam abspielen. Sie eignen sich daher sehr gut für geskriptete Ereignisse und Zwischensequenzen.
Wie werden Jobs benutzt
Für jeden Job gibt es zwei Funktionen, die diesen erzeugen. Eine Funktion, die den Job erzeugt und sofort ausführt, und eine, die den Job nur erzeugt, ohne ihn auszuführen und dadurch erlaubt den Job in eine JobSequenz zu packen. Für all diese gilt die gleiche Namenskonvention, ohne '_' davor führt den Job sofort aus, mit '_' gibt den Job zurück, ohne ihn auszuführen. Direkte Ausführung im Beispiel:
require 'jobs/soundjobs.rb'
PlaySound2d("doorcreak.ogg")
Dieser Befehl spielt den sound "doorcreak.ogg" ab. Rückgabe eines Jobs:
require 'jobs/soundjobs.rb'
job = _PlaySound2d("doorcreak.ogg")
Dieser Befehl gibt den Job zurück, den Sound "doorcreak.ogg" abzuspielen, ohne es auch zu tun. Um den Sound dann tatsächlich zu spielen, muss man ihn beim JobScheduler anmelden;
# Wird bereits in globals.rb so definiert. $JS = JobScheduler.getSingleton(); # Melde den Job 'job' zur Ausführung an.. # Dabei ist die 20 die Priorität des Jobs, je höher der Wert, desto öfter wird die Aktion ausgeführt, # jedoch maximal einmal je frame. # Bei allen aktuellen Jobs, spielt dieser Wert keine Rolle und sollte einfach als 20 gesetzt werden. # Das dritte Argument ist die Verzögerung, bis der Job gestartet wird. Hier also in 1,5 Sekunden. $JS.addJob(job, 20, 1.5)
Um die Aneinanderreihung von Jobs zu erleichtern, gibt es die Funktion jobSequence. jobSequence erwartet ein array als Eingabe, das Jobs und Verzögerungen enthält. Ein Beispiel:
require 'jobs/jobsequence.rb'
require 'jobs/soundjobs.rb'
require 'jobs/animationjobs.rb'
jobSequence(
[
_PlayAnimation(go.getActor(), "auf"),
_PlaySound3d("doorcreak.ogg", go.getPosition()),
2,
_PlaySound3d("lachen.ogg", go.getPosition()),
2,
_PlayAnimation(go.getActor(), "zu"),
_PlaySound3d("doorcreak.ogg", go.getPosition())
]
);
Dieser Aufruf spielt zuerst den Sound "doorcreak.ogg" und die Animation "auf" gleichzeitig ab. Dann werden 2 Sekunden gewartet. Danach wird der Sound "lachen.ogg" gespielt dann werden wieder 2 Sekunden gewartet und dann werden Animation "zu" und Sound "doorcreak.ogg" gleichzeitig abgespielt. Das array kann also Zahlen für die Verzögerung in Sekunden und Jobs enthalten. Jede Zahl verzögert die Ausführung der nachfolgenden Jobs.
Welche Jobs gibt es
Momentan gibt es die folgenden Jobs:
# Spiel sound "soundname" mit der Lautstärke volume. Wenn volume nicht angegeben ist, dann ist sie 1.0, also maximal. PlaySound2d(soundname, volume=1.0) # Wie oben, zusätzlich wird aber die Position im Raum berücksichtigt, angegeben durch den Parameter position. PlaySound3d(soundname, position, volume=1.0) # Spielt die Animation animationsname für den Aktor actor ab. PlayAnimation(actor, animationsname)
Diese Job-Funktionen gibt es jeweils auch mit '_' beginnend für die Verwendung in einer JobSequence.
(Fragen zu dem Artikel bitte in den Diskussionsteil)
