zwei fragen zum thema LUA´s

  • was muss ich eintippen damit sich der gegen stand 90 grad um die X achse dreht?.
    und was muss ich eintippen damit sich ein gegenstand zuschaltbar ist?.
    weil ich möchte volgenes mit den scrips tuen:
    zuschaltbar: Häckselaufbauten,zwillingsreifen
    Gegenstand um 90 grad X achse drehen : front kupplung in zwei positionen wie tobii es hat :D
    danke ;)
    hoffe ihr versteht mich. ?(

  • danke! jetz weis ich wie die einträge in den LUA´s heissen müssen.
    jetz muss ich das nur noch iwie der XML klar machen :wacko:


    wie genau mach ich das ?! also scripte einbauen is ja eigentlich nicht schwer.
    aber was soll ich jetz genau machen das die XML weis das ich die FH drehen möchte und nichs anderes :whistling:
    also ich habe mir es so vorgestellt:


    <specializations>
    <specialization name="FH-script" className="FH-script" filename="Specializations/FH-script.lua"/>
    <specialization name="acceleration" className="Acceleration" filename="Specializations/Acceleration.lua"/>
    <specialization name="transmission" className="Transmission" filename="Specializations/Transmission.lua"/>
    <specialization name="hud" className="Hud" filename="Specializations/Hud.lua"/>
    <specialization name="ignition" className="Ignition" filename="Specializations/Ignition.lua"/>
    <specialization name="camera" className="Camera" filename="Specializations/Camera.lua"/>
    <specialization name="worklights" className="Worklights" filename="Specializations/Worklights.lua"/>
    <specialization name="rotation" className="Rotation" filename="Specializations/Rotation.lua"/>
    <specialization name="sound" className="Sound" filename="Specializations/Sound.lua"/>
    <specialization name="PowershaftT" className="PowershaftT" filename="Specializations/PowershaftT.lua"/>
    </specializations>


    <vehicleTypes>
    <type name="JD7810" className="Vehicle" filename="$dataS/scripts/vehicles/Vehicle.lua">
    <specialization name="motorized" />
    <specialization name="steerable" />
    <specialization name="hirable" />
    <specialization name="aiTractor" />
    <specialization name="acceleration" />
    <specialization name="transmission" />
    <specialization name="ignition" />
    <specialization name="hud" />
    <specialization name="camera" />
    <specialization name="worklights" />
    <specialization name="rotation" />
    <specialization name="sound" />
    <specialization name="PowershaftT" />
    <specialization name="FH-script" />
    </type>
    </vehicleTypes>


    jo jetz bin ich raatlos was ich die input bindings schreiben soll , und wie ich der XML sage was sich genau am mod bewegen soll...
    (selbst verständlich hab ich die LUA eingefügt und auch so benannt wie es in der modesk steht,die ich hier geschrieben habe)

  • nachtrag bzw. kleine korrektur bzgl. rotieren...
    Wenn du ein Objekt um 90° drehen willst, verwende

    Code
    rotate(nodeID,0,math.rad(90),0);


    Wenn du ein Objekt auf 90° rotieren willst, dann verwendest du

    Code
    setRotation(nodeId,0,math.rad(90),0);


    der entscheidende Unterschied ist der, dass bei setRotation das Objekt auf eine bestimmte Rotation gesetzt wird. HeadshotXXL hat das in seinem Beispiel dadurch gelöst das er vorher die bisherige Rotation des Objekts ausliest und dann 90° dazu addiert. Das ist aber ein zusätzlicher Zwischenschritt der nicht notwendig ist. Natürlich ist der Zeit/Performance-Verlust zu vernachlässigen aber Kleinvieh macht auch Mist und bei einem großen Script kommen schnell mal 20 oder 30 unnötige Funktionen dazwischen und das macht dann auch mal 2-3 Frames aus.

  • nächster Hinweis:


    Scripte, Klassen und Funktionen sollten keine Bindestriche enthalten. Prinzipiell sollte man sich in der Programmierung auf rein alphabetische Bezeichner beschränken. Der Bindestrich dürfte Probleme bereiten.


    Bzgl. InputBinding - die InputBindings gehören in die ModDesc - haste bestimmt schon bei anderen Mods gesehen:

    Code
    <inputBindings>
    <input name="FHrotieren" key="KEY_4" button="" />
    </inputBindings>


    den Name verwendest du später im Script - auch hier keine Sonderzeichen, keine Leerzeichen, nur alphanumerisch.
    um dem Script zu sagen was er rotieren soll gibt es in deinem Falle 2 Möglichkeiten.
    1. Gängig ist es , einen Eintrag in der Fahrzeug-XML zu hinterlegen, den du im Script ausliest. zB

    Code
    <frontFH index="13|0" />


    ausgelesen wird das im Script im :load() Abschnitt mit so einer Zeile :

    Code
    self.nodeId = Utils.indexToObject(getXMLString(xmlFile,"vehicle.frontFH#index"));


    indexToObject() verwendet den Index und liefert dafür die unique-ID der FH zurück.
    getXMLString holt einen String (text) aus der XML-Datei - aus dem Knoten <vehicle><frontFH index="" >


    2. Alternativ da es sich speziell um die FH eines Traktors handelt und diese von der Vehicle.lua sowieso bereits ausgelesen wird, kannst du dir den Eintrag sparen und auf die hinterlegte nodeId zurück greifen. Die NodeId die du benötigst lautet:

    Code
    local nodeId = self.attacherJoints[2].bottomArm.rotationNode;


    (attacherJoint 1 ist hinten , 2 ist vorn , 3 und folgende sind die Anhängekupplungen - so zumindest bei normalen Traktoren)


    um die Tasteneingabe abzufragen bitte nicht die Funktion :keyEvent() nutzen - die ist veraltet. Direkt im Update-Bereich die Tasteneingabe abfragen:

    Code
    if InputBinding.hasEvent(InputBinding.FHrotieren) then
    self.FHrotieren = not FHrotieren;
    end;


    so kannst du eine Statusvariable (self.FHrotieren) bei jedem Tastendruck wechseln lassen. Vorausgesetzt du hast sie im load() Bereich vorher definiert ( self.FHrotieren = false; )

  • boah danke sven das hat mir sehr geholfen :D


    und wie muss das heisen um ein node ein und aus zu blenden? wär auch noch nett wen du es mir verraten könntest ;)

  • öhh


    im Script bei load


    self.Ausblendung = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.Ausblendung#index"));
    self.AusblendungTeil = true;


    und bei function kommt das hier rein:


    if self:getIsActive() then
    if self.Ausblendung ~= nil then
    if InputBinding.hasEvent(InputBinding.Ausblendung) then
    self.AusblendungTeil = not self.AusblendungTeil;
    end;
    end;
    if self.Ausblendung ~= nil then
    setVisibility(self.Ausblendung, self.AusblendungTeil);
    end;
    end;


    ja und in der xml dann



    <Ausblendung index="Hier den Index" />


    und in der Moddesc


    <inputBindings>
    <input name="Ausblendung" key="KEY_X" button="" />
    </inputBindings>


    Wenn ich mich etz net ganz täusche ist das so^^

  • nachtrag bzw. kleine korrektur bzgl. rotieren...
    Wenn du ein Objekt um 90° drehen willst, verwende

    Code
    rotate(nodeID,0,math.rad(90),0);


    Wenn du ein Objekt auf 90° rotieren willst, dann verwendest du

    Code
    setRotation(nodeId,0,math.rad(90),0);


    der entscheidende Unterschied ist der, dass bei sehttp://planet-ls.de/board/index.php?form=PostAdd&threadID=5183tRotation das Objekt auf eine bestimmte Rotation gesetzt wird. HeadshotXXL hat das in seinem Beispiel dadurch gelöst das er vorher die bisherige Rotation des Objekts ausliest und dann 90° dazu addiert. Das ist aber ein zusätzlicher Zwischenschritt der nicht notwendig ist. Natürlich ist der Zeit/Performance-Verlust zu vernachlässigen aber Kleinvieh macht auch Mist und bei einem großen Script kommen schnell mal 20 oder 30 unnötige Funktionen dazwischen und das macht dann auch mal 2-3 Frames aus.


    was ist genau der unterschied zwischen Um und Auf ?.
    und was genau muss ich verändern damit der node sich um die Y achse 180° dreht ?.
    ihr seid echt geute helfer danke! :thumbsup: :thumbup: 8o :) :rolleyes:



    Edit:
    also fassen wir mal zusammen,wie muss das FH script nun heissen? (die LUA)

  • öhm - also was der Unterschied zwischen "um" und "auf" ist, das definiert meines Erachtens nach die deutsche Sprache - und in Mathe hat man sowas auch mal gelernt - vom gesunden Menschenverstand mal ganz zu schweigen...


    ändere ich etwas von 10° auf 90° dann ist es danach bei 90°
    ändere ich etwas von 10° um 90° dann ist es danach (je nach Richtung) -80° oder 100°


    btw. deine Signatur ist in jeder Hinsicht eine Frechheit. >>Privat<< Mods tauschen und auch noch Hilfe verweigern die man selbst ständig in Anspruch nimmt.

  • die signatur,wurde schon vom chef entfernt,die wird auch nie wieder reinkommen (bzw nur "kein support per PM" )
    ich danke jedem der in diesem thread was geschriben hat,und somit mir ziemlich geholfen hat.
    aber ich kapiere immer noch nicht wie nun die Lua aussehen muss,könnt ihr mir das nochmal erläutern bitte ?. danke :)

  • ja die LUA wie die heißt ist dir selbst überlassen^^. Und wie die LUA aussehen muss ja wie einige es dir hier gezeigt haben. Schau dir doch einfach mal nen anderen Script an vergleiche es mit noch einem anderen evtl von einem erfahrenen Scripter dann ist das ganze einfacher^^. Dann wirst du gleichheiten und ungleichheiten entdecken und du wirst sehen wie sich eine LUA zusammensetzt. Klar könnte man dir hier gleich den fertigen Script geben aber das ist nicht sinn und zweck des Threads hier nur hilfe sonst kannst dir ja gleich einen Scripter suchen oder ? Helfen ja aber Arbeit den anderen machen lassen nein ^^

  • anbei das minimalste Grundgerüst einer Spezialisierung. Die bereits eingetragenen Funktionen sind Pflicht und müssen immer vorhanden sein.
    Natürlich solltest du in deinem Falle alle "myScript" umbenennen in etwas , was zu deiner Spezi passt.


    alles was aus der XML geladen werden soll kommt in den Bereich load()
    alles was im Spielverlauf passieren soll (rotationen, bewegungen etc) gehört ins update().
    alle Ausgaben gehören in den Bereich draw().

  • Hi,


    wenn es nur so rotieren soll ja, ansonsten kannst du halt noch andere Funktionen im update(dt) einbauen.
    Das "dt" steht glaube ich für "delta time", welche die Zeit die seit der letzten Aktualisierung der Funktion in M-Sekunden ausgibt, das was im Update steht wird ständig aktualisiert. (Teil des Gameloops?!)


    Sven hat es ja schon gesagt, was wo hin kommt. Im Update setze ich halt meistens Sachen nach Bedingungen fest, Bewegungen etc.!
    Ich nehme nochmal ein Besipiel.
    [lua]function test:update(dt)
    if InputBinding.hasEvent(InputBinding.Test) then -- in der moddesc eine input: "<input name="Test" ... />"
    self.test = not self.test; -- test ist dann das gegenteil vom status bevor ich die taste gedrückt habe (dafür das "hasEvent")
    end;


    if self.test then -- (ist genause wie wenn ich sage if self.test == true, ist halt einfacher so)
    rotate(self.objekt, 5, 0, 0)
    end;
    end;[/lua]


    Ich muss halt der Variable "self.objekt" ein Objekt geben, das geht über die "indexToObjekt" Funktion, welche im "Load-Teil" steht und auf ein Attribut in der .xml Verweist, dann kann man dank des Scenegraphs einen Index angeben und bestimmtes Objekt kann behandelt werden, in diesem Falle lassen wir es rotieren.


    lg
    Skully

  • dt ist die delay-time - die verzögerungszeit. Die benötigt man letztlich um eine Bewegung oder Aktion Zeitsyncron für jeden Rechner zu gestalten. Das Spiel geht nacheinander alle Update() Funktionen aller Mods durch und fängt dann direkt wieder von vorne an. Je nach Anzahl der Mods kann daher der Zeitraum bis zum erneuten Aufruf der Update-Routine variieren.

Jetzt mitmachen!

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