Aloha,
in diesem Beitrag möchte ich euch gerne das Thema "Schranke" näher bringen, da es diesbezüglich in letzter Zeit einige Fragen gab. Im Grunde genommen kann man hier nach demselben Ablauf verfahren, wie bei einem Tor. Die häufigsten Probleme gibt es allerdings bei der Funktion moveObject() sowie der Rotation.
1. Schritt: Zunächst erstellen wir die Schranke mit createObject().
Zitatgate = createObject (968, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, 270, 270)
Model-ID (in diesem Beispiel die ID einer Schranke)
X-Koordinate des Objektes auf der Karte
Y-Koordinate des Objektes auf der Karte
Z-Koordinate des Objektes auf der Karte
Rotation der X-Achse in Grad
Rotation der Y-Achse in Grad
Rotation der Z-Achse in Grad
Des Weiteren legen wir im Vorfeld bereits 2 Variablen fest:
ZitatgateIsOpen = false
gateMovingState = false
Die 1. Variable gibt an, ob die Schranke geöffnet ist (true) oder nicht (false).
Die 2. Variable gibt an, ob sich die Schranke gerade öffnet bzw. schließt (true) oder nicht (false).
2. Schritt: Nun kommen wir zur eigentlichen Funktion.
Zitatif gateMovingState == false then
Mit dieser Zeile überprüfen wir, ob sich die Schranke derzeit bewegt. Wenn sie sich gerade schließt oder öffnet, wird die Funktion an dieser Stelle "abgebrochen".
Zitatlocal playerx, playery = getElementPosition(source)
if getDistanceBetweenPoints2D(1544.7106933594, -1630.7544189453, playerx, playery) < 20 then
Damit die Schranke nicht von jedem x-beliebigen Standort, sondern nur aus der unmittelbaren Nähe, geöffnet werden kann, ist diese if-Anweisung bedeutsam.
Zitatif gateIsOpen == false then
...
else
...
end
Nun überprüfen wir, ob die Schranke derzeit geöffnet oder geschlossen ist, um die Funktion moveObject() mit den richtigen Koordinaten zu füttern:
Zitatif gateIsOpen == false then
moveObject (gate, 3000, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, 90, 0)
else
moveObject (gate, 3000, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, -90, 0)
end
Objekt, das bewegt werden soll
Zeit in Millisekunden, in der das Objekt am Ziel ankommen soll (bestimmt somit auch die Geschwindigkeit - Weg/Zeit)
X-,Y- und Z-Koordinate bleiben in diesem Fall gleich
Die letzten Argumente sind die Entscheidenden. Wichtig ist hierbei, dass der Wert relativ zur derzeitigen Rotation sein muss. D.h. hier darf nicht die Rotation angegeben werden, die das Objekt am Ende haben soll. Es muss ein Wert angegeben werden, um wie viel Grad sich die Rotation ändern soll. Damit sich die Schranke öffnet bzw. schließt muss nur der Wert für die Y-Achse angegeben werden.
Man kann durch logisches Denken und Beherrschung von Addition bzw. Subtraktion diese Angaben überprüfen:
1) die Schranke ist geschlossen (270°)
2) Funktion wird ausgeführt
3) die Schranke wird geöffnet (270° + 90° = 360°)
4) Funktion wird ausgeführt
5) die Schranke wird geschlossen (360° - 90° = 270°)
Sollte die Rotation der Y-Achse 90° betragen, müssten die Vorzeichen dementsprechend getauscht werden.
Nun müssen wir natürlich noch unsere zwei Variablen anpassen:
ZitatgateIsOpen = not gateIsOpen
gateMovingState = true
setTimer(changeGateMovingState, 3000, 1)
Der Timer führt nach 3 Sekunden (= 3000 Millisekunden) eine Funktion aus, die die Variable "gateMovingState" ändert. Nach dieser Zeit sollte die Schranke zum Stillstand gekommen sein.
3. Schritt: Als letztes erstellen wir die Funktion changeGateMovingState().
Zitatfunction changeGateMovingState ()
gateMovingState = not gateMovingState
end
Hier noch einmal das gesamte Script:
gate = createObject (968, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, 270, 270)
gateIsOpen = false
gateMovingState = false
function gateMoving (source)
if gateMovingState == false then
local playerx, playery = getElementPosition(source)
if getDistanceBetweenPoints2D(1544.7106933594, -1630.7544189453, playerx, playery) < 20 then
if gateIsOpen == false then
moveObject (gate, 3000, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, 90, 0)
else
moveObject (gate, 3000, 1544.7106933594, -1630.7544189453, 13.07799911499, 0, -90, 0)
end
gateIsOpen = not gateIsOpen
gateMovingState = true
setTimer(changeGateMovingState, 3000, 1)
end
end
end
addCommandHandler("schranke", gateMoving)
function changeGateMovingState ()
gateMovingState = not gateMovingState
end
Alles anzeigen
Natürlich gibt es mehrere Varianten. Ich habe diese genutzt, um das Ganze verständlich zu erklären.