Bewegungsskript

  • Hallo,


    da ich mal was mit .lua machen wollte, hab ich mir mal versucht was zusammenzuschreiben, das die Position Y an meinem UFO (das ich als Testobjekt benutze) um 1 nach oben verschieben soll, wenn man das Input Binding "UP" drückt.


    Nur funktioniert das nicht. Kann mir da jemand helfen?


    [lua]
    ufo = {};


    function UFO.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;



    function UFO:load(xmlFile)
    end;


    function UFO:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function UFO:keyEvent(unicode, sym, modifier, isDown)
    end;




    function UFO:update(dt)


    if self:getIsActiveForInput() and InputBinding.isPressed(InputBinding.UFO_UP) then
    local x,y,z = getWorldTranslation(self);
    posY = local y;
    posY + 1;
    setTranslation(self, local x, posY, local z);
    end;

    end;




    function UFO:draw()
    g_currentMission:addHelpButtonText(g_i18n:getText("UFO_UP"), InputBinding.UFO_UP);
    end;[/lua]

  • Nach ein bisschen Bastelei und jeder Menge vergleichen mit anderen Skripts (wegen der Syntax) läuft es ingame. Nur habe ich einen Error ganz oft in der log, und zwar


    XML
    D:/code/lsim2011/build/finalbin/dataS/scripts/InputBinding.lua(1467) : attempt to perform arithmetic on local 'posX' (a table value)
    Lua: Error running function: mouseEvent


    Nur weis ich nicht, wovon der kommt/wie ich den beheben kann. Ich währe erfreut über Aufklährung, denn das Sture übersetzen der einzelnen Wörter ergibt für mich keinen Sinn :huh:

  • Grundsätzlich... ein dynamisches Objekt kannst du nicht via setTranslation bewegen. Ein statisches kannst du garnicht bewegen. Und Fahrzeuge zum selber drinnen sitzen werden so schon garnicht bewegt.


    Zeile 22: self ist ein Table der jede Menge Daten enthält - aber es ist kein 3D Objekt - du kannst nicht dessen WorldTranslation auslesen. Dafür musst du self.rootNode nehmen.
    Zeile 23: local gehört vor posY um diese Variable lokal zu deklarieren. Hinter einer Zuweisung hat das nix mehr verloren.
    Zeile 24: ist zwar eine tolle Aktion - bewirkt aber garnix da hier die zuweisung fehlt. Wenn , dann fasse gleich beide Zeilen zusammen local posY = y + 1;
    Zeile 25: auch hier nocheinmal... local hat an dieser Stelle nix zu suchen.


    ich weiss nicht was du konkret vorhast - ich vermute mal du willst dein Ufo als Spielerfahrzeug wie einen Heli schweben lassen und so steuern - ich empfehle dir , dich erstmal mit der Scriptsprache lua zu beschäftigen , dann noch ein wenig davon zu lernen und dich dann an etwas wesentlich einfacherem zu versuchen. Ein Objekt in LS schweben oder fliegen zu lassen ist nicht so einfach - sonst gäbe es auch schon dutzende von Flugobjekten.

  • Danke für die Aufklärung. Mein Gedanke dabei war, mit etwas ala verschiebe dich oder so anzufangen. Aber offenbar ist das bei dynamischen Objekten nicht so einfach machbar, ich probier mich in Zukunft an was anderem.


    Achso: Ich hab das Ufo mit setTranslation tatsächlich zum hochheben bekommen, nur war dann die log voll mit dem oben genannten Error.

  • als "Modell-Ufo" kannste das machen. So lange du nicht selber drinnen sitzt.
    Also Objekte die keinen RigidBody oder als RigidBody "kinematik" haben , kannst du mit setTranslation und setRotation bewegen.


    Einfacher wäre es damit zu beginnen Teile an einem Fahrzeug zu bewegen.

  • Ich hab mal probiert, ein skript zu schreiben, das Doppelreifen aus- und einblendet.


    [lua]
    Twinwheels = {};


    function Twinwheels.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;


    function Twinwheels:load(xmlFile)
    self.twinfront1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinfront1#index"));
    self.twinfront2 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinfront2#index"));
    self.twinback1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinback1#index"));
    self.twinback2 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinback2#index"));
    setVisibility(self.twinfront1, true);
    setVisibility(self.twinfront2, true);
    setVisibility(self.twinback1, true);
    setVisibility(self.twinback2, true);
    self.frontvisibility = true;
    self.backvisibility = true;
    end;


    function Twinwheels:delete()

    end;


    function Twinwheels:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function Twinwheels:keyEvent(unicode, sym, modifier, isDown)
    end;


    function Twinwheels:update(dt)

    end;


    function Twinwheels:draw()
    -- Wenn Taste gedrückt wird, wird die Sichbarkeit geändert (sichtbar/nicht sichtbar)
    if InputBinding.hasEvent(InputBinding.TWINSFRONT) then
    self.frontvisibility = not self.frontvisibility;
    end;


    if InputBinding.hasEvent(InputBinding.TWINSBACK) then
    self.backvisibility = not self.backvisibility;
    end;


    -- Sichtbarkeit der Frontreifen wird gesetzt
    if InputBinding.hasEvent(InputBinding.TWINSFRONT) then
    setVisibility(self.twinfront1, self.frontvisibility);
    setVisibility(self.twinfront2, self.frontvisibility);
    end;

    -- Sichtbarkeit der Hinterreifen wird gesetzt
    if InputBinding.hasEvent(InputBinding.TWINSBACK) then
    setVisibility(self.twinback1, self.backvisibility);
    setVisibility(self.twinback2, self.backvisibility);
    end;
    end;[/lua]


    In der .i3d sind die Reifen nicht visibility.


    Nur passiert nichts, wenn man im Game die Taste für die Input Bindings drücke?

  • ich glaube du musst dass mit den Tasten in keyevent machen



    Twinwheels = {};


    function Twinwheels.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;


    function Twinwheels:load(xmlFile)
    self.twinfront1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinfront1#index"));
    self.twinfront2 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinfront2#index"));
    self.twinback1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinback1#index"));
    self.twinback2 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.twinback2#index"));
    setVisibility(self.twinfront1, true);
    setVisibility(self.twinfront2, true);
    setVisibility(self.twinback1, true);
    setVisibility(self.twinback2, true);
    self.frontvisibility = true;
    self.backvisibility = true;
    end;


    function Twinwheels:delete()


    end;


    function Twinwheels:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function Twinwheels:keyEvent(unicode, sym, modifier, isDown)
    if sym == Input.KEY_7 and isDown then
    self.twinbackactivate = self.twinbackactivate+ 1;
    if self.twinbackactivate == 2 then
    self.twinbackactivate= 0;
    end;
    end;


    if sym == Input.KEY_8 and isDown then
    self.twinfrontactivate = self.twinfrontactivate + 1;
    if self.twinfrontactivate == 2 then
    self.twinfrontactivate = 0;
    end;
    end;
    end;


    function Twinwheels:update(dt)


    end;


    function Twinwheels:draw()
    -- Wenn Taste gedrückt wird, wird die Sichbarkeit geändert (sichtbar/nicht sichtbar)
    if self.twinfrontactivate == 1 then
    self.frontvisibility = not self.frontvisibility;
    end;


    if self.twinbackactivate == 1 then
    self.backvisibility = not self.backvisibility;
    end;



    -- Sichtbarkeit der Frontreifen wird gesetzt
    if self.twinfrontactivate == 1 then
    setVisibility(self.twinfront1, self.frontvisibility);
    setVisibility(self.twinfront2, self.frontvisibility);
    end;


    -- Sichtbarkeit der Hinterreifen wird gesetzt
    if self.twinbackactivate == 1 then
    setVisibility(self.twinback1, self.backvisibility);
    setVisibility(self.twinback2, self.backvisibility);
    end;
    end;

  • Nein, das Inputbinding ist komfortabler, weil man die Tastenbelegung individuell anpassen kann ;).



    Außerdem ist es in diesem Fall unsinnig mit integern zu arbeiten wenn man es einfacher mit boolean´s regeln kann. (integer = zahlenwerte, boolean = true oder false).



    [lua]
    -- Wenn Taste gedrückt wird, wird die Sichbarkeit geändert (sichtbar/nicht sichtbar)
    if InputBinding.hasEvent(InputBinding.TWINSFRONT) then
    self.frontvisibility = not self.frontvisibility;
    setVisibility(self.twinfront1, self.frontvisibility);
    setVisibility(self.twinfront2, self.frontvisibility);
    end;


    if InputBinding.hasEvent(InputBinding.TWINSBACK) then
    self.backvisibility = not self.backvisibility;
    setVisibility(self.twinback1, self.backvisibility);
    setVisibility(self.twinback2, self.backvisibility);
    end;


    [/lua]


    Oh, grade gesehen, dass du deine Zeilen in den "draw" teil gerutscht sind.
    Alle Tastenevents bzw. Änderungen an Variablen gehören in den Update Teil.
    Der "draw" Abschnitt wird lediglich dazu benutzt, Bilder bzw. Text anzuzeigen ;)



    So, hoffe habe nichts vergessen. Keine Gewähr auf die Rechtschreibung. Bin grade unterwegs...^^


    mfg

Jetzt mitmachen!

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