Jump to content

alternativer Türcode für Hawkeye


Goetz

Empfohlene Beiträge

  Hallo Hawkeye,

vor 3 Stunden schrieb Hawkeye:

Verbesserungsvorschläge sind immer willkommen.

Dann habe ich hier einen neuen Türöffner für dich:

--[[----------------------------------------------------------------------------------------------
  Türen öffnen, wenn Zug am Bahnsteig hält und Animation "Türen öffnen/schließen" vorhanden ist.
------------------------------------------------------------------------------------------------]]
local BahnsteigSeite = ({["links"] = 0, ["rechts"] = 1})[Zug.variables["Bahnsteig"]]
local Fahrtrichtung = ({["vorwärts"] = 0, ["rückwärts"] = 1})[Zug.variables["Richtung"]]

for i, Wagen in pairs(layout:getVehicleGroup(Zug, 0)) do
  local Wagenrichtung = ({["links"] = 0, ["rechts"] = 1})[Wagen.variables["Türen in Fahrtrichtung"]]
  if BahnsteigSeite and Fahrtrichtung and Wagenrichtung then
    local Seite = (BahnsteigSeite + Fahrtrichtung + Wagenrichtung) % 2 + 1 -- ergibt 1 oder 2
    local Tueren = Wagen.variables["Tueren"][Seite]
    if Tueren then
      Wagen.animations[Tueren]:play(-1, 1)
    end
  end
end

Die Basis ist, dass alle Einzelbedingungen gemeinsam haben, dass sie ein entweder/oder sind. 
Und auch in Summe ergeben sie wieder entweder/oder -> Tür links oder rechts.
Das entspricht gerade oder ungerade. Und das bekomme ich mit Modulo 2.
Da zuletzt die Zahl 1 oder 2 benötigt wird, addiere ich dem Modulo Ergebnis noch eine 1 hinzu.

Noch etwas zu der Art, wie ich deine Texte aus den Variablen in Zahlen umwandle:

{["links"] = 0, ["rechts"] = 1}

 ist eine Tabelle mit den Bezeichnern "links" und "rechts" für die Werte 0 und 1.

Wenn man die Tabelle in runde Klammern setzt und dahinter in eckige Klammern einen Bezeichner schreibt, ist das Ergebnis das Element aus der Tabelle, welches durch den Bezeichner benannt wird. Existiert der Bezeichner, der in der eckigen Klammer angegeben ist, in der Tabelle nicht, ist das Ergebnis = nil

In der Prüfung wird nil von Lua als false gewertet.
Deshalb muss ich dort nur den Inhalt prüfen und keinen Vergleich anstellen.
Jeder existierende Wert einschließlich 0 gilt in Lua als true

 

Viele Grüße
Götz

Bearbeitet von Goetz
Formatierungsfehler korrigiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 59 Minuten schrieb Goetz:

Dann habe ich hier einen neuen Türöffner für dich:

Hallo Götz, 

Danke dafür, 👍👍 Werde ich morgen mal probieren.😊

Die Entwicklung aller möglichen Kombinationen, bis es dann endlich für alle Fahrzeuge und Waggons reibungslos funktionierte, hatte schon ein Weilchen gedauert. Deshalb auch noch die vielen print()- Anweisungen für das Ereignisprotokoll (zur Fehlersuche>:(

Wenn der Code noch optimiert werden kann, umso besser.👍:)

Nochmals Merci und 

viele Grüße,

Hawkeye

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 24 Minuten schrieb Hawkeye:

Die Entwicklung aller möglichen Kombinationen, bis es dann endlich für alle Fahrzeuge und Waggons reibungslos funktionierte, hatte schon ein Weilchen gedauert.

Und davon habe ich bei meiner Optimierung profitiert.
Weil ich sehen konnte, welche Faktoren beachtet werden müssen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen, Hawkeye

Da diese Spezialform von kleinen Zuordnungstabellen vielleicht doch zu exotisch ist, habe ich gerade noch eine Variante geschrieben, die eher "klassisch" gestrickt ist:

--[[----------------------------------------------------------------------------------------------
  Türen öffnen, wenn Zug am Bahnsteig hält und Animation "Türen öffnen/schließen" vorhanden ist.
------------------------------------------------------------------------------------------------]]
local WerteTabelle = {["links"] = 0, ["rechts"] = 1, ["vorwärts"] = 0, ["rückwärts"] = 1}
local BahnsteigSeite = WerteTabelle[Zug.variables["Bahnsteig"]]
local Fahrtrichtung = WerteTabelle[Zug.variables["Richtung"]]

for i, Wagen in pairs(layout:getVehicleGroup(Zug, 0)) do
  local Wagenrichtung = WerteTabelle[Wagen.variables["Türen in Fahrtrichtung"]]
  if BahnsteigSeite and Fahrtrichtung and Wagenrichtung then
    local Seite = (BahnsteigSeite + Fahrtrichtung + Wagenrichtung) % 2 + 1 -- ergibt 1 oder 2
    local Tueren = Wagen.variables["Tueren"][Seite]
    if Tueren then
      Wagen.animations[Tueren]:play(-1, 1)
    end
  end
end

Mit einer einzigen Wertetabelle am Anfang sind alle Umformungen im Code vielleicht einfacher nachvollziehbar.
Im Kern passiert aber exakt dasselbe wie im Beispiel darüber.

Viele Grüße
Götz

Bearbeitet von Goetz
Formatierungsfehler korrigiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 33 Minuten schrieb Goetz:

Da diese Spezialform von kleinen Zuordnungstabellen vielleicht doch zu exotisch ist

Moin Götz, 

gar nicht, ich finde Alternativen in jeder Form gut, wenn ich weis, welches Ergebnis erzielt werden soll. Dann kann ich den Code auch nachvollziehen. Meine Programmierkenntnisse beziehen sich leider noch auf Fortran, Basic und Turbopascal. Das ist schon eine Weile her. 

Ich lerne aber mit Lua gerne weiter dazu, weil es Spaß macht. Deshalb immer nur her damit. :D 

Viele Grüße,

Hawkeye  

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...