[vR] Automatische Zugschlusstafeln

  • Hallo,
    leider konnte ich die letzten 3 Wochen nicht online sein und habe so einiges verpasst.
    Trotzdem möchte ich noch einen Tipp zum LUA-Befehl "require" geben, da ich diesen bei der kommenden Formsignalversion schon erfolgreich eingesetzt habe.
    Mit folgender Syntax funktioniert der Befehl:


    require "Assets/Kuju/RailSimulator/RailNetwork/signals/German Sem/Dateiname"


    Die geladene Datei heisst dann "Dateiname.lua"
    Klar, dass der Dateipfad und Dateiname noch angepasst werden muss.


    Gruß Schuster

  • ich bevorzuge loadfile() und hoffe es funktioniert auch wie gedacht. Aber warscheinlich nicht. Require aber führt den Code ja auch sofort aus wie dofile(). Das wiederstrebt mir etwas.

  • Falls du Header-Dateien mehrmals einbinden willst, solltest du dann nicht sowas wie in C machen aka #pragma once?


    Wäre dann in Lua (C-Style notwendig):


    Code
    if SOURCE_H == nil then
        SOURCE_H = 0
        {QUELLCODE}
    end


    Schützt vor mehrmaligen Einbinden. Ansonsten sollte require und dofile nichts anderes machen.
    Include macht ja auch nichts anderes und wurde in Lua eingeführt, um die Einarbeitung aus anderen Programmiersprachen zu erleichtern?
    Edit: Include versucht ja einfach nur ohne Rückmeldung die Datei zu lesen. Ob es klappt ist eine Überraschung. require() verlangt hingegen
    die explizite Existenz der Datei und dessen Ausführbarkeit - sonst wird ne Exception geworfen.

  • Doppelte Einbindung brauchen wir hier wohl nicht wirklich beachten. Wir schreiben ja keine kompletten Programme sondern nur Fetzen zum Hauptprogramm. Über das Einbinden will ich nur doppelten Code in verschiedenen Fahrzeugen vermeiden und natürlich etwas Ordnung schaffen.


    Möglicherweise greife ich aber doch zu require weil diese Module doch eher was mit OOP zu tun haben statt einzelne Funktionen mit loadfile() einzubinden. In ein Modul kann ich wenigstens mehrere Methoden reinpacken.

  • Wegen dem sofortigen Ausführen würd ich mich nicht streßen.
    Nachdem du bei --include keine Garantie hast, in welcher Reihenfolge die Files eingebunden (und daher auch ausgeführt werden), mußt du sowieso alles in irgendeine Funktion stopfen. Statements auf top-level, wie die Konstantendefinitionen in den Default Files, sind wegen obiger Unsicherheit nicht das Gelbe vom Ei. Und mehr als die Funktionsdefinitionen ansehen kann Lua auch nicht, wenn es ein File über require "ausführt".


    Was mir schon mehr zu Denken gibt, das sind die vielen Ladevorgänge, wenn man erst zur Laufzeit Programmteile zusammenstellt. Das macht aber bei Loks deutlich weniger als bei Signalen, weil viel mehr Signale herumstehen als Loks unterwegs sind.

  • Hab jetzt mit require und "Objekten" meine Unordnung aufgelöst. Mal sehen wie weit ich da gehe was die Dynamik angeht. Ständig was nachzuladen ist nicht notwending. Es geht mir eher darum wiederverwertbaren Code zu erzeugen. Also das was man im allgemeinen mit Klassen und Modulen in der Programmierung macht. Ich will nich in jeden Fahrzeug ständig den ganzen Rattenschwanz reincoden müssen. Sondern einfach nur mit require und ner Setup-Methode reinladen (am Anfang des Files, nicht in Funktionen oder Schleifen).


    Interessant sind natürlich dabei die Möglichkeiten für steuerbare, gleichartige aber dennoch "unterschiedliche" Objekte in den Fahrzeugen (3 Anzeigen mit unterschiedlichen Inhalten als Beispiel). Halt typisches Klassenbasiertes Programmieren. Nur eben etwas anders weil so richtige Klassen gibt es eben nicht.

  • Nachladen in Funktionen war dumm ausgedrückt. Natürlich denk ich da immer an Initialise und davon aufgerufene Methoden, nicht irgendwas zur eigentlichen Laufzeit.


    Bzw. mußt du - zumindest bei den Signalen - Teile der Initialisierung in den ersten Aufruf von Update verlegen, weil erst dann das ganze Spiel aufgebaut ist. Ich würd auch vermuten, daß das Senden von Messages innerhalb des Zuges am Spielstart besser hier aufgehoben ist als in Initialise. Bzw. würde es mich nicht wundern, wenn in Initialise noch kein Waggon weiß, wer oder was an ihm dranhängt.


    Aber um andere stellen als Initialise oder erster Aufruf von Update geht es natürlich nicht.

  • Grundsätzlich scheint mir das Lua da drin aber doch sehr performant zu sein. Wenn man jetzt bei einer Spielerlok alleinig solche herzhaften Spielerkens anstellt wird das kein Probelem sein. Man muss das nur bei KI-Fahrt oder Stillstand dann alles abschalten.


    Initialise is eh komisch. Der Aufruf passiert ja erstmalig wenn das Vehicle "Platz (Gleis) nimmt". Da wird auch zuverlässig Update aufgerufen wenn man es denn callt. Aber wenn man dann das Fahrzeug besteigt, dann versucht zwar RW selbst die Funtion erneut aufzurufen, findet diese aber nicht mehr. Offenbar wird die Funktion nach dem ersten Aufruf aus dem Speicher entfernt. Möglicherweise um doppelte Aufrufe von irgendwelchen Funktionen zu unterbinden.


    Messages an den Consist schicke ich nur in Update, OnConsistMessage oder OnControlValueChange. Weder global noch in Initialise.


    Kuriositäten gibts aber immer wieder. Habe erst vor paar Tagen gesessen und gesuch und gesucht. Und nix gefunden. Selbst beim schrittweisen Debuggen war kein Fehler zu erkennen. 4 Anweisungsblöcke, in allen 4 an sich fast das Selbe drin nur mit verschiedenen Werten. Im 4. Block funktioniert das was in den anderen 3 genauso steht einfach nicht. In dem Fall ein Call("*:AddTime") bzw Reset an eine Animation. RW mein die AnimationsID wäre nicht bekannt. In den anderen Blöcken aber ist diese scheinbar bekannt. Begreifen tu ichs nicht. Funktioniert nach wie vor auch nicht.