The Elder Scrolls III: Morrowind - Scriptkurs
5. Bewegung und Rotation von Objekten - Teil 2
In der heutigen Lektion geht es zunächst um die Rotation von Gegenständen. Dies ist wenn man so will noch mal eine Wiederholung der Translation (also Bewegung) aus der letzten Lektion. Die Befehle sind genau gleich strukturiert. Da dies nur ein sehr kleiner Abschnitt ist, beschäftigen wir uns danach noch mit der Fernsteuerung von Objekten. Bisher musste ein Script immer auf dem Objekt liegen, um es zu bewegen. Tatsächlich ist es oft viel einfacher, das Script auf einem anderen Gegenstand laufen zu lassen, der den zu bewegenden gegenstand gewissermaßen fernsteuert.
Rotation von Gegenständen
Neben der Bewegung von Gegenständen entlang einer Achse, kann man sie auch um eine Achse rotieren lassen.
Vergleich des absoulten Welt-Koordinatensystems (schwarz) und des relativen Koordinatensystems eines Gegenstands (rot).
Das relative Koordinatensystem mit X' und Y' ist aus einer Drehung des Gegenstandes um die Z-Achse um 45° entstanden.
Die Befehle für die Rotation sind (analog zur Bewegung):
Rotate
RotateWorld
GetAngle
Wieder bezeichnet hier Rotate eine Rotation um die relative Achse und RotateWorld um die absolute Achse. Als Zahl wird diesmal die Winkelgeschwindigkeit in Grad pro Sekunde angegeben. Im obigen Bild bedeutet ein RotateWorld, X, dass sich das Objekt um die schwarze mit X bezeichnete Achse dreht. Ein Rotate, X lässt das Objekt aber um die rote mit X' bezeichnete Achse rotieren.
Ein Beispiel für Rotationsscripte sind die Tresenklappen:
Code:
begin BarDoor
float timer
short on
short open
if ( MenuMode == 0 )
if ( OnActivate == 1 )
if ( on == 0 )
set timer to 0
set on to 1
PlaySound3D, "Door Creaky Open"
endif
endif
if ( on == 1 )
set timer to timer + GetSecondsPassed
if ( open == 0 )
if ( timer < 1 )
Rotate, X, 110
elseif ( timer >= 1 )
set on to 0
set open to 1
endif
elseif ( open == 1 )
if (timer < 1)
Rotate, X, -110
elseif ( timer >= 1 )
SetatStart ;nicht zwingend nötig, beseitigt in diesem Fall kleine Abweichungen, der Position, die durch die Bewegung entstehen können
set on to 0
set open to 0
endif
endif
endif
endif
end
Um noch ein Beispiel für die Abfrage des Winkels zu liefern: Im obigen Bild mit den Koordinatensystemen würde GetAngle, Z den Wert 45 zurückliefert.
Bewegung von Gegenständen aus der Ferne
Bisher wurden immer nur die Gegenstände, auf denen das Script selbst lag, bewegt. Viel öfter möchte man aber ein anderes Script (zum Beispiel ein globales) einen Gegenstand bewegen (oder disablen/enablen) lassen. Deswegen ist es möglich in einem Script Funktionen so aufzurufen, dass sie andere Gegenstände beeinflussen.
Damit dies funktioniert, muss dieser andere Gegenstand aber einen Haken bei reference persistent haben. Was bedeutet das? Normalerweise werden in Morrowind nur die Gegenstände geladen, die sich in der aktuellen Zelle befinden. Ein Gegenstand der als persistent markiert ist, wird beim Spielstart geladen und bleibt immer geladen. Da dies natürlich das Spiel verlangsamt, sollte man möglichst sparsam mit dem Häkchen bei reference persistent umgehen. Bei NPCs und Kreaturen muss corpse persistent ausgewählt werden.
Zusätzlich muss ein Objekt, dass ferngesteuert werden soll, einmalig sein. Das heißt, es muss genau einmal existieren.
Der Activator aus dem ersten Script wurde hier als persistent markiert.
Wenn man nun also solch ein Objekt hat, kann man es aus einem anderen Script heraus manipulieren. Dies kann zum Beispiel ein Schalter sein, der ein Tor steuert. Die Struktur sieht wie folgt aus:
Code:
"Object_ID"->Disable
set "Object_ID".state to 1
---
"ex_gg_portcullis_01"->MoveWorld, Z, 70
set "skinkintreesshade".soulAshGhoul to 1
Der Pfeil (->) dient hierbei zum Aufruf einer Funktion. Das Objekt vor dem Pfeil ist das, was ich immer als aufrufendens Objekt bezeichne. Wird dort kein Objekt angegeben (wie wir bisher immer), wird dort das Objekt eingesetzt, auf dem das Script liegt. Ein Beispiel hierfür ist das Script GG_OpenGate1, dass auf den Schaltern der Geisterpforte liegt und das (persistent markierte) Gitter der Geisterpforte bewegt.
Mit dem Punkt (.) kann man auf eine lokale Variable eines Scripts auf dem angegebenen Gegenstand zugreifen und diese verändern oder abfragen. Diese Variable muss dazu auch existieren, weiterhin muss der Träger des Scriptes in den letztn 72 Stunden Spielzeit tatsächlich geladen worden sein!
Ein Beispiel hierfür ist das Script SkinkSoul1.
Aufgaben
- Warum wird im Beispiel der Tresenklappe die Funktion Rotate und nicht RotateWorld benutzt?
- Erstellt eine Tür aus einem Activator. Diese soll sich wie eine normale Tür verhalten.
- Erstellt einen Aufzug, der nach Betätigen eines Rufknopfs nach oben beziehungsweise unten fährt und dort bleibt, bis ein Rufknopf erneut betätigt wird.
- Bonusaufgabe: Erstellt einen Aufzug, der 5 verschiedene Haltepunkte besitzt. an jedem dieser Haltepunkte soll es einen Rufknopf geben, mit dem man den Aufzug auf diese Ebene rufen kann. Der Aufzug soll eine Bedientafel besitzen, an der man jede der Zieletagen auswählen kann. Der Aufzug soll von jeder Ebene zu jeder fahren können.
-
Im nächsten Teil beschäftigen wir uns mit der Teleportation von Objekten und der Bewegung relativ zu einem anderen Objekt. Aber erstmal zu diesem Teil. Ich bin mir sicher, dass es viele Fragen geben wird