Mover Level 2
Nutzerinfo
Dieses Wiki, Mover-Level 2, baut auf, auf dem Wiki Mover-Level 1.
Punkte wie:
Grundwissen
Kollision
Keyframes programmieren
Keyframes löschen
Keyframes ändern
Testfahrten
Deshalb wird dringlich empfohlen, für Unkundige, das
Wiki Mover-Level 1 vorher durchzuarbeiten und sich die Grundkenntnisse über die einfachste Form des Movers anzueignen →
Mover Level 1
…….behandeln wir in diesem Wiki - Mover mit Drehbewegungen.
1. Mover-Teilrotation
Ich gebe folgende Situation vor: Der Player läuft durch einen Flur, dessen Ende in einen Raum mündet, wo man eine Truhe erkennen kann. Leider ist der Weg zum Objekt der Begierde versperrt durch eine Beilfalle die aus 4 hintereinander liegenden schwingenden doppelseitigen Klingen besteht, die auch noch mit unterschiedlicher Geschwindigkeit sich bewegen.
2. Mover-Einsetzen
4a Der Nullpunkt des Pendels ist auch der Drehpunkt des Movers. In unserem Falle, genau in der Mitte des Achslagers. Solche Teile müsst ihr euch anfertigen in einem 3DS-Prog - wie zB →
3D Studio Max oder
Blender.
Ihr könnt auch in der Modellschmiede nachfragen,wenn ihr so etwas braucht, ob euch das jemand anfertigt. In diesem Falle würde ich empfehlen, bei der Anfrage eine vermasste Skizze zu „uploaden“
Die Achse, um die sich das Klingenbeil dreht ist schon im Weltmesh eingebaut, ebenso die Deckenschlitze, in denen sich die Pendelachsen bewegen sollen.
Warum bauen wir kein Vobtree →
Vobtrees aus den Einzelteilen um das dann leicht überall einsetzen zu können?
Weil jede der 4 Beilklingen ein Mover sein wird, mit eigener Position und differenter Geschwindigkeit. Wenn ich die Mover jetzt einsetze und programmiere, dann hat jeder Frame eines jeden Movers seine eigenen Positionsdaten in meiner Welt.
Diese Positionsdaten würden in eurer Welt abgerufen werden und wenn ihr das einsetzen würdet, befänden sich die Mover auf diesen Koordinaten, vielleicht irgendwo unter Wasser, oder im Weltall. Ihr müsstet alle Keyframes aller Mover löschen und dann neu aufbauen. Einen Vorteil sehe ich darin nicht.
Deshalb macht es auch kaum Sinn, einen Mover, den ihr vielleicht noch mal einsetzen wollt zu kopieren, denn der springt dann einfach auf die Position zurück, auf der er kopiert wurde. Muss man dann ebenfalls die Daten neu setzen.
Overwrite der Moverdaten ist sinnlos, da bei jedem Klick auf den Mover, der wieder durch die Welt springt auf seine programmierte Position. Das wäre Mühe ohne Ende.
Aber wer glaubt das mit Kopie hinzubringen…..nur zu!!
3. Mover-Positionieren
3.a Internals
a2 Wenn wir bei aktivierten Objekt auf den Ordner Internals doppelklicken, gibt uns das Objektfenster die Weltkoordinaten preis, genau die Position, wo unser Mover platziert ist.
Wenn wir jetzt diese Höhe kopieren, und die Internals des 2ten Movers öffnen, können wir in diesem Fenster die gewünschte Höhe eingeben und nach einem Klick auf „Apply“ bewegt sich unser 2ter Mover genau da hin. Wenn wir das jetzt auch noch mit den „seitwärts“ Koordinaten wiederholen, dann sitzt der 2te Mover fast schon perfekt ausgerichtet, so dass wir diesen nur noch auf der Achse hin und her schieben müssen. Das Ergebnis ist exakter als alles was ihr mit den Bewegungstasten erzielen könntet und auch schneller erreichbar.
4. Keyframe-Programmieren
Das ist die Position Keyframe 0
Wir klicken im ObjektPagesFenster auf „New Key“. (Vorhehr prüfen ob der Punkt auf „Insert“ gesetzt ist)
Wir klicken auf „Apply“ im Objektfenster
Damit ist Keyframe 0 des Movers_D programmiert
Wieder auf den Mover_D klicken - BoundingBox zeigt sich
Wir drehen das Pendel mit der „bild-auf“ Taste zur anderen Wandseite, ebenfalls bis knapp an die Mauer
Das ist die Position Keyframe 1
Wir klicken im ObjektPagesFenster auf „New Key“
Wir klicken auf „Apply“ im Objektfenster
Damit ist Keyframe 1 des Movers_D programmiert
4.a KeyFrame-Korrigieren
5. Mover-Test
6. Mover-Einstellungen
triggerTarget:NAME_OBJEKT_WAS_GETRIGGERT_WERDEN_SOLL (hier könnten wir als Adresse unseren eigenen Mover selbst eingeben, wenn wir wollten, dass nach dem Öffnungsvorgang das Movergitter wieder automatisch zuläuft)
Besonderheiten und Macken: Manchmal (selten) ist der Eintrag einfach nicht da um den Speed einzustellen. Was tun?
*.Zen abspeichern, Spacer verlassen und neustarten. Dann ist der Speedeintrag wieder da! Toll???
7. Mover-Steuerung
Wld_SENDTRIGGER("KLINGENFALLE_A_01");
Wld_SENDTRIGGER("KLINGENFALLE_B_01");
Wld_SENDTRIGGER("KLINGENFALLE_C_01");
Wld_SENDTRIGGER("KLINGENFALLE_D_01");
Falle soll bei Game-Start anlaufen - alle 4 Mover
Wenn sich der Player durch die Klingen laviert hat, soll er die Falle abschalten können
Endlos wäre das, wenn wir nicht noch einen Schalter eingebaut hätten, dass wenn der Player sich durch die Pendelklingen laviert hat, er die Pendelklingen ausschalten kann. Wir setzen mit dem Scriptfunc des Schalters zum abschalten die Variable auf 1..
// __Startup.d Entry__
// Aufruf-Jeder Mover benötigt ein eigenes Script, wegen verschieden langer Laufzeit.
Wld_SendTrigger("TS_BEIL_A"); // aufgerufen wird oCTriggerScript
Wld_SendTrigger("TS_BEIL_B"); //
Wld_SendTrigger("TS_BEIL_C"); //
Wld_SendTrigger("TS_BEIL_D"); //
var int pendel; // variable
// Falle abschalten
func void stop_pendel() //onStateFunc Schalter
{
pendel = 1;
};
// Falle Start
func void start_pendel_a() // ScriptFunc 0CTriggerScript
{
if (pendel == 0)
{
Wld_SendTrigger("MC_BEIL_A"); // aufgerufen wird zCMoverController
};
};
func void start_pendel_b() // ScriptFunc oCTriggerScript
{
if (pendel == 0)
{
Wld_SendTrigger("MC_BEIL_B"); // aufgerufen wird zCMoverController
};
};
func void start_pendel_c() // ScriptFunc oCTriggerScript
{
if (pendel == 0)
{
Wld_SendTrigger("MC_BEIL_C"); // aufgerufen wird zCMoverController
};
};
func void start_pendel_d() // ScriptFunc oCTriggerScript
{
if (pendel == 0)
{
Wld_SendTrigger("MC_BEIL_D"); // aufgerufen wird zCMoverController
};
};
Da wir 4 Mover haben mit unterschiedlicher Geschwindigkeit, brauchen wir:
4 Stück oCTriggerscript_A, _B, _C, _D
4 Stück zCMoverController_A, _B, _C, _D
denn wenn ein Mover einen Startbefehl bekommt, bevor er seine Strecke abgearbeitet hat, dann macht er unvorhersehbare Richtungswechsel.
7.a oCTriggerScript
Wer sein Wissen über oCTriggerScript vertiefen möchte, der sollte das tun, indem er obenstehenden Link anklickt. Die Einstellungen hier, sind speziell unserem Beispiel angepasst.
7.a.2 Wir setzen einen oCTriggerscript (Teil der Fallensteuerung des Beilpendels_A). Dazu klicken wir uns im Objektfenster durch den Pfad → zCVob → zCTriggerBase(abstract) → zCTrigger → oCTriggerScript
Wir klicken mit der rechten Maustaste in das Spacer Hauptfenster und erhalten das kleine „Vob-Fenster“ mit der Option „Insert (oCTriggerScript)“
Wir klicken mit der linken Maustaste auf „Insert (oCTriggerScript)“, erhalten ein „graues Würfelchen“ mit „Koordinatenkreuz“ und der Benennung „oCTriggerScript“
Wir geben dem oCTriggerscript einen Namen, passend zum ersten Mover den er steuern soll „vobname:TS_BEIL_A (IN GROSSBUCHSTABEN) und kein Visual
Dieser Triggername,
TS_BEIL_A steht in der Startup.d damit zum Gamestart die Falle anläuft. Siehe →
mover-steuerung Punkt 7.3
Wir ändern die beiden Einträge „respondToPc:TRUE auf FALSE“ (Hero) und „respondToNpc:TRUE auf FALSE“ (alle anderen), damit nicht doch mal Pc/Npc da reinlaufen und unerwünschte Schaltungen auslösen könnte.
Wir wählen einen passenden Namen für den
scriptFunc:START_PENDEL_A . Dieser Name erscheint im Script zum Aufruf der Pendelfalle_A. Siehe →
mover-steuerung Punkt 7.3
Mit „Apply“ alle Angaben speichern“!
Den kompletten Vorgang 7.a.2 → 3 mal singemäss nachvollziehen für die 3 weiteren oCTriggerScript B-C-D
7.b zCMoverController
Wer sein Wissen über zCMoverController vertiefen möchte, der sollte das tun, indem er obenstehenden Link anklickt. Die Einstellungen hier, sind speziell unserem Beispiel angepasst.
8. Schadensregelung
Um bei Berührung eines Npc mit den Beilklingen einen Schaden zu erzielen benutzen wir einen oCTriggerSCript, den wir als Child of Mover an die Beilklingen hängen →
trigger_touch 2.A