[Tutorial] Die Schranke

  • 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().

    Zitat

    gate = 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:

    Zitat

    gateIsOpen = 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.

    Zitat

    if 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".

    Zitat

    local 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.

    Zitat

    if 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:

    Zitat

    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

    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°)

    Externer Inhalt www10.pic-upload.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.


    2) Funktion wird ausgeführt
    3) die Schranke wird geöffnet (270° + 90° = 360°)

    Externer Inhalt www10.pic-upload.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.


    4) Funktion wird ausgeführt
    5) die Schranke wird geschlossen (360° - 90° = 270°)

    Externer Inhalt www10.pic-upload.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.


    6) …

    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:

    Zitat

    gateIsOpen = 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().

    Zitat

    function changeGateMovingState ()
    gateMovingState = not gateMovingState
    end

    Hier noch einmal das gesamte Script:

    Natürlich gibt es mehrere Varianten. Ich habe diese genutzt, um das Ganze verständlich zu erklären.

  • Dieses Thema enthält 20 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!