Es gibt viele Neuheiten, ich schreibe lieber getrennte Forumsbeiträge über die einzelne Themen.
Makros mit Parametern: bisher gab es nur bei den Präprozessor-Makros ( %DEF() ) die Möglichkeit an die Makros Parameter zu übergeben. Ab Version 4.19 geht das mit den Laufzeit-Makros ( $DEF ) auch.
Innerhalb des Makro-Textes dienen die Zeichenpaare $1 $2 ... $9 als Platzhalter für die Parameter. Falls man den Makro mit Parametern aufrufen möchte, dann schreibt man einen $ vor der Name:
Code
$DEF ZUG1=LOK,$1,WAGEN
Beim Aufruf ohne $
Code
C=ZUG1;
wird daraus
Code
C=LOK,,WAGEN;
(die zwei Kommas nebeneinander stören bei einem Zugdefinition nicht.)
Beim Aufruf
Code
C=$ZUG1(POSTWAGEN);
entsteht
Code
C=LOK,POSTWAGEN,WAGEN;
Die aktuelle Parameter sind mind KOmma getrennt. Will main innerhalb des Parameterwertes einen Komma übergeben, muß man den Parameter in Klammern setzen (aber die Klammern werden auch übergeben). Also,
C=$ZUG1((POSTWAGEN,GEPAECKWAGEN));
generiert
C=LOK,(POSTWAGE,GEPAECKWAGEN),WAGEN;
- hier stört der zusätzlicher Klammer nicht.
Die $1 .. $9, wirken auch innerhalb von Modifikatoren ( z.B. [O:LADUNG,$1,0] ), was nicht selbstverstänlich ist. Bisher wurden die Modifikatoren unverändert durch die Auswertung durchgeleitet, nur in dem Moment, wenn sie verarbeitet werden (der entsprechende Fahrzeug/Gebäude, der den Modifikator hat, wird gerade gezeichnet).
Die folgende Werte kann man in Bewegungszeilen und in manche Parametern ersetzen lassen:
$W - Breite des Fensters / Bereiches, in dem die aktuelle Zeile oder Sektion läuft
$H - Höhe des Fensters / Bereiches, in dem die aktuelle Zeile oder Sektion läuft
$VH - Höhe der Fahrzeuge (58 Pixel, oder bei anderen Maßstaben kommt der Wert aus der Fahrzeugliste, oder kann man mid den VH= / IMGY= Parameter verändern)
$AB - Platz über den Fahrzeugbereich - der Wert des AB= Parameters
$BL - Platz unter den Fahrzeugbereich - der Wert des BL= Parameters
$MIX(N,LST) - war schon in früheren Versionen vorhanden, wählt aus der LST liste Fahrzeuge/Hintergrundelemente so lange aus, bis der Anzahl N erreicht ist.
$FLG(FLAG,TRUEPART,FALSEPART) - auch schon i früheren Versionen enthalten, bedingte Ausdruck abhängig von den Vorhandenseit eines Flag ( FLG= ) Wertes. Die FLags dienen in erste Linie für den Auswahl aus Pools.
$EVAL(EXPRESSION) - wird mit den Ergebnis eines arithmetischen Ausdrucks ersetzt.
$IF(EXPRESSION, TRUEPART, FALSEPART) - abhängig von dem Ergebnis eines Ausdruckes wird die erste oder Zweite Möglichkeit gewählt. In dem Ausdruck können die übliche arithmetische und logische Operationen und Vergleiche, Klammer verwendet werden: + - * / < = > <= != <> >= & && | || ! ~ .
$IFVAR(NAME, TRUPART, FALSEPART) - prüft, ob eine Variable vorhanden ist, und welchen Wert hat.Wenn der numerischer Wert 0 ist,oder die Variable leer oder nicht vorhanden ist, wird der FALSEPART verwendet, bei anderen Zahlen, oder wenn die Variable keine Zahl ist, wird der TRUEPART verwendet.
Die Laufzeit-Makros müssen als eine Name da sein, und ihren Wert wird so geliefert, als der Inhalt des Makros in Klammern stehen würde. Das gleiche gilt für die $XXX -Werte (mit Ausnahme von $1-$9): sie müssen als Name da stehen, und was sie zurückgeben, zählt, als in Klammern stehen würde. So kann man aber keinen "noch ein Auswahl" - Konstrukt machen.
Wenn innerhalb derAuswahl
Code
A|B|C
B ein Makro ist, der manchmal einen Wagen darstellt, manchmal leer ist, dann, wenn es leer ist, besteht die Möglichkeit, das die ganze Auswahl nichts zurückgibt. Meißtens wollen wir aber, dass der Auswahl entweder kleiner oder größer ist, manche Elemente stehen ab und nicht zum Auswahl, aber der Auswahl sollte immer einen Fahrzeug oder Hintergrundkonstrukt zurückgeben.
Dazu dient der &IF(BEDINGUNG,TRUEPART,FALSEPART) Konstrukt.
Es wird als erstes in dem Moment ausgewertet, wenn die Analyse des Parameters anfängt, und - was noch wichtiger ist - sein Wert wird nicht in verdeckten Klammern eingebunden.
Also,
Code
A &IF(BEDINGUNG,|B) |C
sieht - abhängig von der Bedingung - entweder als A|B oder als A|B|C aus.
Als Bedingung kann ein Ausdruck stehen mit der selben Oparationmöglichkeiten, wie bei $EVAL.
Names (hier ohne $) bedeuten auch die selbe: W, H, VH, AB, BL . Flags frägt man mit FLG(FLAGNAME) ab, Variablen einfach die Variablenname hinschreiben.
Es gibt auch einen
Code
&FLG(FLAG,TRUEPART,FALSEPART)
bedingter Ausdruck, der Ähnlicherweise fast alles (ausser einen Komma, der nicht innerhalb Klammern steht) als TRUEPART oder FALSEPART beinhalten kann. Es ist dann nur eine Abkürzung von
Code
&IF(FLG(FLAG),TRUEPART,FALSEPART)
Dass man die Variablen abfragen kann, haben wir schon gesehen ($IF, &IF). Wie stellt man sie aber ein ?
Es gibt eine neue Parameter, VAR= , dahinter können die Zuweisungen stehen, mit Komma getrennt, z.B.:
Code
VAR=BGTYPE=3,BGUP=53;
So ein Parameter kann in der Bewegungszeilen stehen, aber auch in der Segmentierungsbefehlen, wie $GROUP, $SECTION. In der Segmentierungsbefehlen wirken sie sofort (also falls etwas hier asugewertet wird, wie z.B. BG= und FG= in einem $GROUP), aber sie werden an die enthaltene weitere Segmentierungsbefehlen und Bewegungszeilen weitergegeben.
Bisher (bis Version V4.18) waren die Parameterlisten der Segmentierungsbefehlen nur ein mal, ganz am Anfang ausgewertet, die ERgebnisse dann eventuell an die enthaltene innere Segmentierungsbefehle weitergegeben. Ab Version 4.19 wird die Parameterliste dann ausgewertet, wenn der $SECTION / $GROUP Platz an dem Bildschirm bekommt, und anfängt zu laufen. Also, steht irgendwo ein Zufallsauswahl, oder werden Parameterwerte in Laufzeit dazu genommen, was die aktuelle Werte verändern kann, werden die neue, aktuelle Werte vererbt.
Dazu kommt, dass auch die Segmentierungsbefehle ab Version V4.19 den Parameter POOL= haben können. In einem Pool können nicht nur Bewegungszeilen stehen, sondern auch andere Dinge, z.B. Hintergrunddefinitionen, oder reine Parameter. Wer die Datei poolsec.ttt in Version 4.19 anschaut, findet ganz am Anfang einen Pool:
Aus dem RWMODE Pool wird geholt, wie sollen die einzelne Bewegungen dargestellt werden: wie viel Platz braucht man oberhalb der Fahrzeuge, ob eine extra breite virtuelle Bereich auf dem Bildschirm bewegt sein soll (VM= , DX= ), und der frisch eingeführte VAR= -Befehl.
Wer dann in der Datei BG_DEF.TTT nachschaut, findet dort $IF und &IF-Befehle, die diese Variablenwerte BGTYPE und BGUP abfragen.Abhängig von BGTYPE wird entweder gar keine Hintergrund generiert (alte MM&MM-Styl), nur Bahndamm und Oberleitung (bisherige Traffic-Styl), oder eine volle, zufällige Hintergrund mit unterschiedlichen Höhen. Und manche Hintergründe können nicht in breite, andere nich in hohe Streifen verwendet werden - dazu die höhen- oder breiten-abhängige Auswahl von Hintergründen.
Falls ich etwas vergessen habe (also Ihr etwas in der mitgelieferten Fahrplandateien findet, was noch unbekannt ist), oderetwas nicht ganz klar ist, fragt ihr !
Eine, von der vorherigen Themen unabhängige Sache habe ich vergessen: nur in Hintergrund-Definitionen gibt es eine [WMIX:<Breite>,<Bild1>,<Bild2>, ... ] . Es sieht aus, als ein Modifikator (also was hinter einzelne Bilder oder im Falle von Hintergrunddefinitionen auch hinter Bildergruppen stehen würde), ist aber keine: steht als ein selbsständiges Bild da. Bedauere, so war die einfachste die Durchführung so lange auszuzögern, bis es sinn hat.
Es ist der große Bruder von $MIX() : aus der Liste nimmt zufällig Bilder so lange, bis der gesamte Länge der Bilderreihe den Wert der ersten Parameter erreicht. Es gibt mehrere Varianten:
[WMIXS: ] verwendet jedes Bild nur ein mal. Falls der Gesamtlänge der Bilder die gewünschte Gesamtbreite nicht erreicht, wird die erstellte Bilderreihe kürzer, als die gewünschte Länge.
[WMIXF: ] fängt an die Bilder noch mal zu verwenden, wenn es zum Ausfüllen der gewünschte Länge braucht.
[WMIX: ] ist mit [WMIXS: ] identisch.
Falls die gewünschte Länge nicht genau erreicht wird (was üblicherweise der Fall ist), dann wird die erstellte Bilderreihe ein bischen länger, als die gewünschte Länge.
Steht an der Stelle der gewünschten Lánge kein Wert ( z.B.: [WMIXF:,Haus1,Haus2,Haus3] ), oder stehen dort zwei Punkte ( .. ), dann füllt [WMIX: ] die gesamte Länge des Bildschirms / Bewegungszeilenbreite aus.Bearbeitet von godeny am 23.09.2016 07:58
Beiträge: 160 Ort: Berlin Eingetreten: 25.07.12 Status: Offline
Eingetragen am 08.10.2016 10:31
Sehr Schön – funktioniert tadellos. Bei der Gelegenheit möchte ich darauf aufmerksam machen,
dass es eine Dokumentation mit dem Umgang von Traffic gibt. Die gibt es hier zu lesen.
Auf dieser Seite findet auch dem Internet-basierten Installer von Traffic.
Die Installation funktioniert problemlos und ist empfehlenswert.
Grüße
UlrichBearbeitet von Ulrich am 08.10.2016 20:32
Es gibt im hauseigenen Wiki auch eine allmählich wachsende Traffic-Sektion, an der ich gelegentlich arbeite. Die ist nicht so sehr als Einführung in Traffic in der Art eines Kochbuchs gedacht wie als Nachschlagewerk in der Art der in Traffic eingebauten Hilfe.
&IF wird während das Einlesen durchgeführt.
$IF nur dann, wenn die Zeile verwendet wird.
Hauptgrund für $IF ist der laufende Arbeit um Traffic in Browsers laufen zu lassen: Fahrplan und Fahrzeugliste auf einem Server, heruntergeladen wird nur das was für die aktuelle Szene benötigt wird. Dann geht es nicht mehr, das schon vorab, bei der Einlesen der Fahrplandateien entschieden wird, ob etwas für eine Benutzer benötigt wird, oder nicht.
Diese Webseite verwendet Cookies für die techn. Funktionalität und um Inhalte zu personalisieren und deiner Erfahrung anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du den Einsatz von Cookies. » Hier mehr lesen zum Datenschutz «