Der BBMD-Filmprojektor6: Steuerscript
Projektor Teil 6 - Das Steuerungs-Script
Das Steuer-Script
Vorneweg möchte ich erwähnen, dass das script nur auf Funktionalität und nicht auf logisches scripten aufbaut. Insofern sieht es in einigen Teilen ein wenig unbeholfen aus. Hier könnte man durch einige wenige scriptzeilen die threads „INIT“, „MOVIE_START“ und „MOVIE_MOVE“ ordentlich verkürzen. Wer also mag kann das tuen und vielleicht seine Version auf unserer Page mal posten!
Diese Steuerscript beinhaltet alle notwendigen Threads zum Reibungslosen Ablauf des Projektors mit Bild/Filmwiedergabe, Sound Sowie Qualm und Funkenflug.
Im Nachfolgenden seht ihr Auszüge der einzelnen Threads und eine kleine Erklärung der Funktionen.
1.) Thread „init“
Dieser wird vom Map-Script aus aufgerufen und
-
Setzt die level-variabel „level.projector_isOn” auf 0. Solange dieser Wert „0“ ist, wird kein Film gezeigt.
-
Startet das verschieben der einzelnen, vorbelichteten Bilder auf die Leinwandposition
-
Macht die Bilder, das Projektorlicht und den Lichtstrahl unsichtbar
-
Schaltet die Animation des Rauches und des Funkenflugs ab
-
Initialisiert die Trigger
//-------------------------------------------------------------
init:
//-------------------------------------------------------------
level.projector_isOn = 0
//iprintlnbold "Warten auf Film-Initialisierung"
thread movie_move
$projector_beam hide
$projector_corona hide
$projector_sparks anim stop
$projector_smoke anim stop
$projector_face0 hide
$projector_face1 hide
$projector_face2 hide
usw…….
$projector_face38 hide
$projector_face39 hide
$projector_trigger thread doprojector
$movie_effect_trigger thread movie_effect
$projector_off_trigger thread projector_off
$projector_off_trigger_effect thread projector_off_effect
end
2.) Thread „doprojector”
Die Threadausführung wartet auf Aktivierung durch den “Projector_trigger”, welcher ja im Startraum durchschritten warden muß. Er startet den Projektorsound, das Projektlicht und sorgt dafür,
dass der Projektorlichtstrahl sichtbar wird und ein wenig flackert, solange die Level-Variabel „level.projector_isOn” den Wert „1“ hat.
//------------------------------------------------------------------
doprojector:
//------------------------------------------------------------------
self waittill trigger
$projector_speaker loopsound projector
$projector_corona show
level.projector_isOn = 1
while( level.projector_isOn == 1 )
{
$projector_beam hide
wait .01
if(level.projector_isOn == 1 )
{
$projector_beam show
}
wait .01
}
end
3.) Thread “projector_off”
Wird durch den “projector_off_trigger” ausgelöst. Er stellt die Level-Variabel „level.projector_isOn” wieder auf den Wert „0“ und stellt das Projektorlicht und den Lichtstrahl auf unsichtbar.
//-------------------------------------------------------------------
projector_off:
//-------------------------------------------------------------------
self waittill trigger
level.projector_isOn = 0
$projector_corona hide
$projector_beam hide
end
4.) Thread “projector_off_effect”
Wird durch den “projector_off_trigger_effect” ausgelöst. Er schaltet das Projektorgesurre ab, und startet und beendet die Animation des Qualms und der Funken. Der Rauch wird nach jeweils 10 Sekunden weiter verkleinert und schließlich ganz gelöscht.
//---------------------------------------------------------------------
projector_off_effect:
//---------------------------------------------------------------------
self waittill trigger
$projector_speaker stoploopsound
$projector_sparks anim start
wait 0.5
$projector_smoke anim start
wait 10
$projector_smoke scale 0.2
wait 10
$projector_smoke scale 0.05
wait 10
$projector_smoke anim stop
wait 2
$projector_smoke delete
wait 5
$projector_sparks anim stop
wait 1
$projector_sparks delete
end
5.) Thread „movie_effect“
Wird ebenfalls im Startraum durch den Player ausgelöst. Er startet den thread „MOVIE_START“. Sonst nichts. Warum ich dies so gelöst habe, weiß ich heute nicht mehr, nur ging es irgendwie nicht anders.
//---------------------------------------------------------------------
movie_effect:
//---------------------------------------------------------------------
self waittill trigger
thread movie_start
end
6.) Thread „movie_start“
Regelt das Ein- und Ausblenden der bereits auf die Leinwandposition verschobenen script_objects mit den Bildtexturen, unserem Film.
In Abhängingkeit des Variabelnwertes „level.projector_isOn” werden nacheinander alle Befehle abgearbeitet. Sollte sich zwischenzeitlich der Variabelnwertes „level.projector_isOn” auf „0“ ändern, wird augenblicklich die Bilddarstellung gestoppt.
Der Wait-Befehl 0.04 zwischen dem Ein- und dem Ausblenden der Bildträger erscheint zwar zuerst sehr klein, aber bedeutet das innerhalb einer Sekunde 25 Bilder nacheinander dargestellt werden.
25 Bilder pro Sekunde erlauben eine flüssige Darstellung von Bewegungen und liegt etwa in der Framerate von AVI-Files.
movie_start:
if (level.projector_isOn = = 1)
{
$projector_face0 show
wait 0.04
$projector_face0 hide
wait 0.04
if (level.projector_isOn = = 1)
{
$projector_face1 show
wait 0.04
$projector_face1 hide
wait 0.04
}
if (level.projector_isOn = = 1)
{
$projector_face2 show
wait 0.04
$projector_face2 hide
wait 0.04
}
usw…..
if (level.projector_isOn = = 1)
{
$projector_face38 show
wait 0.04
$projector_face38 hide
wait 0.04
}
if (level.projector_isOn = = 1)
{
$projector_face39 show
wait 0.04
$projector_face39 hide
wait 0.04
}
if (level.projector_isOn = = 1)
{
goto movie_start
}
else
{
}
}
end
7.) Thread “movie_move”
Dieser Thread wird durch den “INIT-Thread” aufgerufen. Er verschiebt – moveto - die Bildträger vom Beleuchtungsraum an die Leinwandposition, welche durch das script_origin „$movie_start_node.origin“ markiert ist. Speed 500 ist die Verschubgeschindigkeit.
movie_move:
$projector_face0 moveto $movie_start_node.origin
$projector_face0 speed 500
$projector_face0 waitmove
$projector_face1 moveto $movie_start_node.origin
$projector_face1 speed 500
$projector_face1 waitmove
$projector_face2 moveto $movie_start_node.origin
$projector_face2 speed 500
$projector_face2 waitmove
usw…..
$projector_face38 moveto $movie_start_node.origin
$projector_face38 speed 500
$projector_face38 waitmove
$projector_face39 moveto $movie_start_node.origin
$projector_face39 speed 500
$projector_face39 waitmove
// iprintlnbold "Fertig mit Bilderbewegen!"
end
Speichert alle eure Einträe in der Datei „cubus_projector.scr“ – oder einer mit beliebigen Namen, im Verzeichnis „mainta/global“ ab.
Wenn ihr jetzt nochmals die Map startet, sollte euer Filmchen bereits laufen. Falls ihr ne Waffe dabei habt, könnt ihr ja mal auf den Projektor ballern……….
Am Ende des Tutorials erfolgt wie gewohnt noch ein Nachwort
© Das bbmd-Team / cubus 2005