-
Gesamte Inhalte
5806 -
Benutzer seit
-
Letzter Besuch
Alle erstellten Inhalte von Goetz
-
Vielen Dank, @gmd Hallo @Eisbär je mehr ich in deiner EV stöbere, desto bescheidener werde ich. Aber es reizt mich, ein paar Tricks beizusteuern, die dir gefallen könnten. Lua beherrscht beispielsweise folgenden Trick: Die Operatoren and und or liefern den ersten oder zweiten Ausdruck als Ergebnis. Das heißt: true or true -- ergibt true, weil der erste Wert true ist 1 or true -- ergibt 1, weil der erste Wert eine 1 ist, die als true gewertet wird true and 1 -- ergibt ebenfalls 1. Beim and wird der zweite Wert zurückgegeben, wenn der erste Wert true ist -- positiv oder negativ? Vorzeichen = x < 0 and -1 or 1 Wusstest du, dass du Objektlisten erstellen kannst, indem du die Objekte (mit Lasso oder Strg) auswählst, Strg+C für Copy drückst und dann die Liste in der EV mittels Paste einfügst? Wenn du deine Listen schon auf diesem Weg erstellt hattest - super! Wenn nicht, dann wirst du den Tipp sicher zu schätzen wissen Gruß Götz
-
In diesem Punkt (und einigen anderen) ist Lua "frech". Und ich kann jeden Programmierer verstehen, dem es widerstrebt diese Frechheiten auszunutzen. Du könntest für die individuellen Unterschiede Datensätze (am besten in Tabellenform) bereithalten und an deine generische Funktion übergeben. Du kannst Tabellen anlegen, die wiederum Wertepaare enthalten. Zum Beispiel Weichen und ihre Stellungen. Und dann deine generische Routine so anlegen, dass sie die Tabelle abklappert und jeder darin enthaltenen Weiche ihre Stellung zuweist, um einen bestimmten Weg zu schalten. Wenn du diese Routine später erweitern möchtest, um beispielsweise Konflikte auszuschließen, dann hast du dafür eine zentrale Stelle ... (sorry, das weißt du als Profi besser als ich ) Lua unterscheidet nicht zwischen Arrays, Tables, Dictionaries, Lists etc. - das ist in dieser Sprache alles dasselbe und obendrein kann man alles in einer Tabelle vermischt anwenden und nach Belieben nesten. Das macht Tabellen in Lua zu einem sehr mächtigen Werkzeug. Geradezu ideal für die Verwaltung von Bahnverkehr etc. Leider bringe ich aktuell nicht die nötige Konzentration auf um dir das anhand eines praktischen Beispiels richtig zu demonstrieren. Randnotiz: Du musst dabei bitte beachten, dass die Tabellen und Listen in Objektvariablen Elemente des MBS sind und an dieser Stelle noch nichts mit Lua zu tun haben. Dort werden Listen und Tabellen unterschieden.
-
Das ist ein beeindruckendes Erstlingswerk. Es ist nicht besonders pflegeleicht, weil es viel "Copy & Paste" Code enthält. Zum Beispiel sind die Skripte unter "Fahraktionen" sechs Mal nahezu identisch. Jede eventuelle Korrektur und Verbesserung müsstest du sechs Mal durchführen. Das finde ich insofern verblüffend, als du gleich darunter (im Ordner "Planmuster") generische Ereignisse hast, die du mit unterschiedlichen Argumenten aufrufst. Dir ist das Prinzip also eigentlich geläufig. Insgesamt ist die EV für das, was sie tut, sehr groß geraten. Deshalb überblicke ich auch noch nicht im Einzelnen, was du wo tust und warum. Man sieht einerseits, dass du eine Menge Werkzeuge kennst, wie z.B. die Verwendung einer namenlosen Funktion, die du an Ort und Stelle definierst. Und andererseits gehst du dann in dieser Funktion hin und prüfst exakt dieselbe Bedingung zweimal, um zwei Tabellen (für Fahrregler und für Loks) zu erstellen. Vorschlag: layout:enumEntities( function(entity) if (string.sub(entity.name, 1, 4) == "Fre_") then -- Fahrregler table.insert($("Skripte").variables["Fahrregler"], entity) -- Loks if (not (entity.connection == nil)) then table.insert($("Skripte").variables["Loks"], entity.connection) end end ) anstatt layout:enumEntities( function(entity) -- Fahrregler if (string.sub(entity.name, 1, 4) == "Fre_") then table.insert($("Skripte").variables["Fahrregler"], entity) end -- Loks if (string.sub(entity.name, 1, 4) == "Fre_") then if (not (entity.connection == nil)) then table.insert($("Skripte").variables["Loks"], entity.connection) end end ) aber das ist sicher Geschmacksache. In Lua gilt übrigens jeder Inhalt einer Variablen als true. Also im Gegensatz zu anderen Sprachen auch die 0 und ebenso ein leerer String. Du kannst also -- statt if (not (entity.connection == nil)) then -- einfach if entity.connection then schreiben. Sorry - das sind einfach nur ein paar beliebige Punkte, die ich spontan kommentiere. Ich hoffe, du kannst damit etwas anfangen. Ich will nicht an deinem Code rumnörgeln sondern nur schauen, ob ich ein paar Anregungen beisteuern kann. Nachtrag: if Bedingung == true then ist eine Zeile, die ich in sehr vielen Skripten lese. Meines Erachtens ist das weder sinnvoll, noch erhöht es die Lesbarkeit. Aber es ist ein Hinweis darauf, dass man Vergleichsoperatoren noch nicht vollends durchschaut hat. Jeder Vergleich kann nur entweder true oder false liefern. Sonst nichts. Und genau das sucht if: entweder ein true oder ein false. Sonst nichts. Wenn also in der Bedingung selbst schon true resp. false steht, dann ist if Bedingung then die bessere Schreibweise. Für die Lesbarkeit wählt man geeignete Variablennamen. -- beispielsweise if Besetzt then -- oder if Zug_ist_bereit then -- oder if habeAnmeldung then -- etc.
-
Hallo Wolfgang, möchtest du nicht lieber zuerst die Lösung für das Problem aus deinem ersten Posting finden, bevor du einer neuen Idee erlaubst in deinem Kopf herumzuschwirren? Die Lösung ist wirklich einfach: Darauf hatte dich Streitross aufmerksam gemacht. Und exakt dasselbe Prinzip findest du auch in fzonks Beispiel wieder. (Das hast du nur nicht genau genug studiert und deshalb für eine ganz andere Idee gehalten.) Gruß Götz
-
aber das kostenlose Gimp kann es. Und Photoshop natürlich auch.
-
Schau mal den von mir verlinkten Film an. Da steht (ziemlich zum Schluss) der Rangierer zwischen den Puffern des ersten Waggons um die Kupplung zu verbinden. Der muss sich also darauf verlassen können, dass sich da nichts verschiebt.
-
Da hast du recht, wie man in dieser Sendung mit der Maus gut sehen kann. Es ist beeindruckend, mit welcher Präzision eine Verschiebelok gefahren wird. Da das MBS aber keine Puffer hat, die sich zusammendrücken lassen, musst du hier ein wenig Spielraum zulassen um das zu kompensieren. Das entspricht dann mehr der Modellbahn und weniger dem realen Vorbild.
-
Das war mein subjektiver Eindruck, den ich mit dieser kleinen Testanlage gewonnen hatte: BremsProbe 02.mbp Der Eindruck kann also durchaus falsch gewesen sein. (Oder sogar meine Erinnerung an das Ergebnis dieser Versuche.) Nachtrag: Pardon, das war die falsche Testanlage. Denn hier wähle ich Geschwindigkeit und Verzögerung beide zufällig und wähle dann für den Bremsbefehl eine Verzögerung, die mich möglichst genau an der Rufsäule anhalten lässt. Beim eigentlichen Testaufbau (den ich erst wiederfinden muss) ging es mir auch hauptsächlich darum zu zeigen, wie gering diese Schwankungen sind. Man kann die Züge realistisch genau stoppen.
-
Das war dann wirklich nur ein subjektiver Eindruck. Tatsächlich werden die Ergebnisse geringfügig schwanken. Bei höheren Geschwindigkeiten stärker als bei niedrigen. Das schönste Ergebnis bekam ich, wenn ich in zwei Stufen gebremst habe. Am ersten Punkt bremse ich auf eine niedrige Geschwindigkeit (z.B. 40 km/h) herunter. Hier stelle ich die Bremskraft abhängig von der aktuellen Geschwindigkeit ein. Und ich bremse so, dass ich die 40 km/h kurz vor dem zweiten Kontakt erreiche. Mit dem zweiten Kontakt bremse ich dann auf 0 runter. Die Bremskraft kann ich an dieser Stelle fest vorgeben, da ich die gefahrene Geschwindigkeit kenne. Das ist erstens genau und zweitens auch realistisch.
-
kannst du meines Wissens jetzt schon haben. Und zwar mit dem Stop-Befehl. Der nimmt ein Argument an für die Position, an der gestoppt werden soll. Das Resultat ist ein Sprung an diese angegebene Stelle. Wie von dir gewünscht. Beispiel: Animation positionieren.mbp Mit der grafischen EV kommt man nur zum Start oder Ende. Schaltet man auf Lua um, dann kann man auch andere Werte benutzen.
-
Geile Idee, dieser Verkehrsknoten in mehreren Ebenen.
-
schicker Bus!
-
Ich vermute (laienhaft!), dass du mit der Spiegelung die "Normalen" umgedreht hast. Ich weiß aber leider nicht, mit welchem Befehl du das korrigieren kannst.
-
Hallo Eddie, das geht, wenn du dort die Weiche erstellst. Also: Katalog -> 3D-Modelle -> neu Und dann: Vorlage -> Gleis/Straße Dort die gewünschten Maße etc. eingeben und das Ergebnis als neues Objekt abspeichern. Die Weiche, welche du auf der Anlage nach deinen Vorstellungen abgeändert hast, nützt dir dabei leider nicht viel. Dort kannst du nur die richtigen Werte abschreiben. Gruß Götz
-
Erklärung von Signalen als Film
Goetz antwortete auf h.w.stein-infos Thema in Anleitungen und Tutorials
Ja. Aber woran es liegt, dass es bei uns beiden unterschiedlich ist, kann ich leider nicht sagen. -
Erklärung von Signalen als Film
Goetz antwortete auf h.w.stein-infos Thema in Anleitungen und Tutorials
Hier laufen alle fünf Videos aus (und in) den letzten drei Beiträgen von @h.w.stein-info einwandfrei. -
Hallo RoniHB, es freut mich riesig, dass ich dir helfen konnte. Nein, das hat mich bisher noch nicht interessiert. Aber da wird sicher noch sehr viel mehr gehen als die gezeigten drei Stufen. Lieben Gruß Götz
-
Die im 3D-MBS eingebaute Funktion nimmt Videos in Einzelbildern auf - ähnlich wie bei einem Stopptrick Film ("Shaun, das Schaf" und "Wallace & Gromit" sind klassische Beispiele dafür.) Diese Methode sorgt für ruckelfreie Videos selbst bei maximalen Grafikeinstellungen, weil die Anlage nicht in Normalgeschwindigkeit läuft, sondern der Rechner für die Berechnung jedes Bildes so viel Zeit nimmt, wie es eben braucht. Aber das kostet Rechenleistung. Eine alternative (und meines Erachtens bessere) Methode ist, dass du "live mitschneidest", was auf deinem Rechner zu sehen ist. Windows 10 bringt dafür gleich eine passende Funktion mit. Alternativ bieten auch Grafikkartenhersteller wie NVidia passende Funktionen für diesen Zweck. Aber um dir da den richtigen Tipp zu geben, müsste ich wissen, welche Windows Version du hast und welcher Grafikprozessor in deinem Rechner steckt. Windows-Taste + G öffnet das Windows Menü für Aufzeichnungen Alt-F9 startet die Aufnahme mit GeForce Experience (wenn das installiert ist)
-
Doch, das hast du klar und deutlich geschrieben. Und hier ist die Antwort auf deine Frage. Relevant sind die ersten 5 Minuten. Anschließend führe ich es noch ein wenig weiter aus und fass zum Schluss noch einmal den Weg kurz zusammen, den ich anfangs beschreibe. .
-
Jetzt wäre eine gute Gelegenheit dazu. Weil es hilfreich wäre.
-
Du könntest einen Timer starten und das Ende eines Durchlaufs als Auslöser verwenden, um eine Variable runterzuzählen. Und die Änderung dieser Variablen kannst du wiederum als Auslöser für den nächsten Animationsschritt nehmen. Oder du änderst jeweils direkt den Wert, der die Größe der Flamme bestimmt. Dabei prüfst du in einer Bedingung jedes Mal den Wert der Variablen. Ist der bei 0 angekommen, dann stoppst du den Timer. Für diesen Zweck sind die Timer in der EV geschaffen worden.
-
Nein, die Verzögerung geht in einer Schleife nicht. Und ohne Verzögerung würdest du alle Werte in sehr schneller Folge nacheinander in dieselbe Variable schreiben. Das braucht insgesamt weniger Zeit als ein Frame. Eine Verzögerung legt eine Art Sprungadresse an. Der Code wird dann an dieser Stelle verlassen und nach Ablauf der gewünschten Zeit springt das Skript wieder dorthin. Du kannst aber eine Schleife nicht temporär verlassen und dabei Schleifenzähler etc. beibehalten. Weder in Lua, noch in anderen Programmiersprachen.
-
Tu das bitte nicht. Eine Verzögerung hat in einer Schleife nichts verloren. Und die gestaffelten Befehle für die Änderungen deiner Flamme gehören nicht in eine Schleife. Weil der nicht in eine Schleife passt. Schreib bitte einfach eine Folge von Aktionen untereinander, jeweils mit einer Verzögerung dazwischen. Wie das geht, kannst du in meinem Straßenbahn Beispiel sehen.