Kapitel 9 Weitere Eigenschaften des Rollmaterials des OR

Weitere Merkmale des Rollmaterials von Open Rails


Eine vollständige Liste der Parameter finden Sie unter Entwickeln von OR-Inhalten – Parameter und Token


9.1 Spitzen- und Schlußlichtsignal


OR unterstützt den gesamten von MSTS akzeptierten Lichtersatz.


9.2 Neigezüge



OR unterstützt Neigezüge. Ein Zug neigt sich, wenn sein .con-Dateiname die geneigte Zeichenfolge enthält: z.B.


ETR460_tilted.con.

9.3 Freightanims und Abholungen


9.3.1 ODER-Implementierung von MSTS-Freightanims und -Abholungen


OR unterstützt die Freightanims wie MSTS (Betankung von Wasser, Kohle und Kraftstoff); beim Befüllen aus einem Wasserkram wird die Animation des Wasserkrams unterstützt; Der Kohlenstand im Tender der Spielerlokomotive sinkt mit dem Verbrauch und steigt beim Nachtanken.


Folgende Pickup-Parameter werden von OR für die MSTS-Animationen berücksichtigt:


• Abholtyp


• Geschwindigkeitsbereich


• Animationslänge


Die Framerate der Aufnahmeanimation wird als Verhältnis zwischen der Anzahl der in der .s-Datei definierten Frames dividiert durch die Animationslänge berechnet.


Wie in MSTS werden Freightanims bei Ausschreibungen anders behandelt als bei anderen Fahrzeugen.


Ausschreibungen:


• Erster numerischer Parameter: Form der vertikalen Position, wenn sie voll ist, relativ zum Ursprung, in Metern


• Zweiter numerischer Parameter: Form der vertikalen Position im leeren Zustand relativ zum Ursprung in Metern.


• Dritter numerischer Parameter: Wenn er auf einen beliebigen positiven Wert gesetzt oder weggelassen wird, wird die Form verkleinert – siehe unten.


– Solange der zweite Parameter niedriger als der erste ist und der dritte Parameter entweder weggelassen wird oder einen Wert ungleich Null hat, sinkt die Form basierend auf dem Kraftstoffverbrauch.


– Ist der zweite Parameter nicht kleiner als der erste, findet unabhängig vom 3. Parameter keine Bewegung statt.


Andere Fahrzeuge:


• Die numerischen Parameter werden nicht verwendet.


9.3.2 ODER spezifische Frachtanimationen und Abholungen


Allgemein


Zusätzlich zur Unterstützung der MSTS-Frachtanimationen bietet Open Rails eine große Erweiterung für Frachtanimationen (im Folgenden OR-Frachtanimationen genannt) und Pickups.


Im Folgenden sind die nativen Funktionen aufgeführt, die Open Rails bietet:


• zwei Arten von OR-Frachtanimationen: kontinuierlich und statisch


• Kontinuierliche ODER-Frachtfahrten beziehen sich auf Güterladungen wie Kohle oder Steine: Die Belastungsstufe im Triebzug variiert je nach Ladungsmenge


• Statische ODER Frachtanimationen sind tatsächlich zusätzliche Formen, die an die Hauptzugform angehängt werden können. Zu solchen Formen kann auch eine Animation gehören (unabhängig vom Zugverhalten);


• Beide Arten von OR-Frachtanimationen können im selben Zugsatz vorhanden sein und mit den Original-MSTS-Frachtanimationen koexistieren


• Beide Arten von OR-Frachtanimationen können sich auf Lokomotiven oder Waggons beziehen


• In einem einzelnen Zugsatz können mehr als ein statisches ODER Frachtanim vorhanden sein


• Ein Wagen kann zu unterschiedlichen Zeitpunkten mit unterschiedlichen Gütern beladen werden


• Waren können geladen (in Abholstationen) und entladen (in Entladestationen) werden.


• Waggons, die kontinuierliche ODER Frachtanimationen unterstützen, können mit einer physischen Animation ausgestattet werden, die beim Entladen des Waggons ausgelöst wird (z. B. Öffnen des Bodens oder vollständige Drehung).


• OR-Freightanims werden mit einem ORTSFreightAnims()-Block innerhalb der .wag- oder innerhalb des Wagon-Abschnitts einer .eng-Datei definiert. Es wird empfohlen, diesen Block wie hier beschrieben in einer Include-Datei zu definieren.


Sich verändernde OR Freightanims


Eine Beschreibung dieser Funktion lässt sich am besten anhand eines Beispiels einer Include-Datei erreichen (in diesem Fall mit dem Namen AECX1636.wag und in einem Openrails-Unterordner im Wagenordner). Beachten Sie, dass die erste Zeile der Datei leer sein muss:


include ( ../AECX1636.wag )

Wagon (

ORTSFreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(22t)

IsGondola(1)

UnloadingStartDelay (7)

FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FreightCoal )

Shape(Coal.s)

MaxHeight(0.3)

MinHeight(-2.0)

FreightWeightWhenFull(99t)

FullAtStart(0)

)

FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FuelCoal )

Shape(Coal.s)

MaxHeight(0.3)

MinHeight(-2.0)

FreightWeightWhenFull(99t)

FullAtStart(0)

)

)

)


Der ORTSFreightAnims-Block besteht aus einer Reihe allgemeiner Parameter, gefolgt von der Beschreibung der OR-Frachtanimationen. Nachfolgend werden die allgemeinen Parameter beschrieben:


• MSTSFreightAnimEnabled gibt an, ob eventuelle MSTS-Frachtanimationen innerhalb des Zugverbandes aktiviert sind (1) oder nicht (0). Dies ist nützlich, wenn man einen Waggon verwenden möchte, bei dem die Ladung bereits mit einer (statischen) MSTS-Frachtanimation angezeigt wird. In einem solchen Fall muss die MSTS-Frachtanimation deaktiviert werden, um die OR-Frachtanimation zu verwenden, mit der die vertikale Position der Frachtform geändert werden kann.


• WagonEmptyWeight definiert die Masse des Waggons im leeren Zustand. Fehlt der Parameter, wird das Gewicht der Ladung nicht berücksichtigt und das Gewicht des Wagens ist immer der in der Root-.eng-Datei vorhandene Wert.


• IsGondola gibt an (falls auf 1 gesetzt), ob die Ladung beim Entladen gedreht werden muss, wie es bei einem Gondelwagen der Fall ist. Wenn er nicht vorhanden ist, wird der Parameter auf 0 gesetzt.


• UnloadingStartDelay gibt, falls vorhanden, an, nach wie vielen Sekunden nach Drücken der T-Taste das Entladen beginnt. Dies liegt daran, dass es einige Sekunden dauern kann, bis der Wagen in eine Entladeposition gebracht wird. Beispielsweise muss sich eine Gondel um mehr als eine bestimmte Gradzahl drehen, bevor die Last zu fallen beginnt.


Es kann mehr als einen FreightAnimContinuous-Unterblock geben, einen für jeden möglichen Ladungstyp. Nachfolgend werden die Parameter des Unterblocks beschrieben:


• IntakePoint hat das gleiche Format und die gleiche Bedeutung wie die IntakePoint-Zeile in den Standard-MSTS-Frachtanimationen. Folgende Ladungsarten werden akzeptiert: FreightGrain, FreightCoal, FreightGravel, FreightSand, FuelWater, FuelCoal, FuelDiesel, FuelWood, FuelSand, FreightGeneral, FreightLivestock, FreightFuel, FreightMilk, SpecialMail. Alle diese Lastarten können definiert werden. Einige der Pickup-Typen (rechts von FuelDiesel) müssen in Wtext-Dateien codiert werden.


• Form definiert den Pfad der Form, die für die Last angezeigt werden soll


• MaxHeight definiert die Höhe der Form über ihrer 0-Position bei Volllast


• MinHeight definiert die Höhe der Form über ihrer 0-Position bei Nulllast


• FreightWeightWhenFull definiert die Masse der Fracht, wenn der Wagen voll ist; Die Masse des Wagens wird berechnet, indem die Masse des leeren Wagens zur tatsächlichen Masse der Fracht addiert wird


• FullAtStart definiert, ob der Waggon zu Spielbeginn voll beladen (1) oder leer ist; Wenn es mehrere kontinuierliche OR-Frachtanimationen gibt, bei denen FullAtStart auf 1 gesetzt ist, wird nur die erste berücksichtigt.


Wie bereits erwähnt, kann der Wagen über eine physische Animation verfügen, die mit dem Entladevorgang verknüpft ist.


Bei einer Gondel konnte damit der gesamte Wagen gedreht werden, während bei einem Trichter damit der Boden des Wagens geöffnet werden konnte. Die Basismatrix innerhalb der Waggonform, die animiert werden soll, muss einen Namen haben, der mit UNLOADINGPARTS beginnt. Es kann mehr als eine geben, z. B. UNLOADINGPARTS1, UNLOADINGPARTS2 usw. Die Bildrate ist fest und beträgt wie bei den anderen Arten von OR-Zugsatzanimationen 1 Bild pro Sekunde.


Um einen Abholpunkt als Abladepunkt zu definieren, muss seine Form in die .ref-Datei der Route als eingefügt werden


Abholobjekt. Hier ist ein Beispiel für den .ref-Block:


Pickup (

FileName ( rotary_dump.s )

Shadow ( DYNAMIC )

Class ( "Track Objects" )

PickupType ( _FUEL_COAL_ )

Description ( "Rotary dumper" )

)


Beim Einlegen in die Route mit dem MSTS Route Editor muss die Füllrate auf einen negativen Wert eingestellt werden.


Ein solcher Pickup (der in Wirklichkeit ein Entlader ist) kann auch animiert werden. Die Basismatrix innerhalb der Wagenform, die animiert werden soll, muss einen Namen haben, der mit ANIMATED_PARTS beginnt. Es kann mehr als eine geben, z. B. ANIMATED_PARTS1, ANIMATED_PARTS2 usw. Was die MSTS-Standard-Tonabnehmer betrifft, so gilt:


Die Framerate der Aufnahmeanimation wird als Verhältnis zwischen der Anzahl der in der .s-Datei definierten Frames geteilt durch die Animationslänge berechnet.


Durch die Kombination einer physischen Animation des Waggons mit einer Entladeranimation können Effekte wie die eines Waggons in einem Rotationskipper erzielt werden, wie im Bild unten zu sehen ist.

Das Be- und Entladen eines Triebzugs wird durch Drücken der Taste <T> ausgelöst, wenn sich der Triebzug am Abhol-/Entladeort befindet.


Statische ODER Frachtanimationen


Für statische ODER Frachtanimationen werden nur die beiden unten aufgeführten allgemeinen Parameter verwendet:


MSTSFreightAnimEnabled (0)


WagenLeergewicht(22t)


Der Unterblock (der in den ORTSFreightAnims-Block eingefügt werden soll) hat das folgende Format:


FreightAnimStatic

(

SubType(Default)

Shape(xxshape.s)

Offset(XOffset, YOffset, ZOffset)

FreightWeight(weight)

Flip()

Visibility ( "Outside,Cab2D,Cab3D" )

)


Wo:


• SubType wird derzeit nicht verwendet


• Shape ist der Pfad der Shape-Datei.


• XOffset, YOffset und ZOffset sind die Offsets der Form in Bezug auf ihre Nullposition und sind nützlich, um die Form präzise zu platzieren.


• FreightWeight ist das Gewicht der spezifischen Ladung. Dieses Gewicht wird zum WagonEmptyWeight-Wert (sofern vorhanden) addiert, um das Gesamtgewicht des Wagens zu ermitteln. Wenn mehrere statische ODER Frachtfahrzeuge vorhanden sind, wird jedes ihrer Gewichte addiert, um das Gesamtgewicht des Wagens zu definieren.


• Flip(), falls vorhanden, dreht die Form um ihren Drehpunkt.


• Sichtbarkeit, falls vorhanden, ändert die Standardsichtbarkeit des statischen Frachtanims. Die Standardeinstellung ist nur von Außenkameras und von allen Innenkameras anderer Lokomotiven als derjenigen sichtbar, die die statische Frachtanimation beherbergt. Wenn der Teilstring „Außen“ vorhanden ist, ist der statische Frachtanimator von Außenkameras und von jeder Innenkamera von Lokomotiven sichtbar, die sich von der Kamera unterscheidet, die den statischen Frachtanimator beherbergt. Wenn Cab2D vorhanden ist, ist der statische Frachtanimator von der 2D-Fahrerhauskamera der Lok aus sichtbar, die den Frachtanimator beherbergt. Wenn Cab3D vorhanden ist, ist die statische Frachtanimation von der 3D-Fahrerhausansichtskamera der Lok aus sichtbar, die die Frachtanimation beherbergt. 1, 2 oder 3 solcher Teilzeichenfolgen können in die Sichtbarkeitszeile eingefügt werden, was eine beliebige Kombination von Sichtbarkeit ermöglicht.


Da für einen Waggon mehrere statische OR-Frachtanimationen definiert werden können, ist es im Falle eines Containerwaggons, der mehr als einen Container transportieren kann, sogar als Doppelstapel, möglich, für jeden Container ein statisches OR-Frachtanim zu verwenden und so dessen Definition zu definieren Position innerhalb des Wagens.


9.3.3 Physikalische Variation mit Lasten


Variable Lasten (sich verändernde Frachtanimation)


Open Rails unterstützt die Variation wichtiger physikalischer Parameter im Wagen, wenn die Ladung innerhalb des Wagens variiert. Folgende Parameter können geändert werden:


• Masse


• Brems- und Handbremskraft


• Reibung (allgemein und Wind)


• Schwerpunkt (Auswirkungen auf die Kurvenleistung)


• Antriebsradgewicht (Auswirkungen auf das Klebegewicht der Lokomotive)


Lokomotiven und Tender, die ebenfalls konfiguriert sind, werden geladen und die oben genannten physikalischen Parameter werden angepasst, wenn Kohle und Wasser verwendet werden. Auch das Haftgewicht (Antriebsradgewicht) wird bei wechselnder Belastung angepasst.


Um den korrekten Betrieb dieser Funktion zu unterstützen, ist ein bekannter physikalischer Start- und Endpunkt erforderlich, dh der Zustand dieser Parameter bei leerem Zustand und der Zustand dieser Parameter bei vollem Wagen oder voller Lokomotive.


Um den Bestand korrekt zu konfigurieren, müssen die folgenden leeren und vollständigen Parameter in die ORTSFreightAnims-Datei aufgenommen werden. Leere Werte sind im ersten Block enthalten und vollständige Werte sind im zweiten Codeblock enthalten. Ein Beispielcodeblock ist unten dargestellt:


ORTSFreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(10.0t-uk)

EmptyMaxBrakeForce ( 29.892kN )

EmptyMaxHandbrakeForce ( 9.964kN )

EmptyORTSDavis_A ( 580.71 )

EmptyORTSDavis_B ( 5.0148 )

EmptyORTSDavis_C ( 0.694782 )

EmptyORTSWagonFrontalArea ( 10.0m )

EmptyORTSDavisDragConstant ( 0.0003 )

EmptyCentreOfGravity_Y ( 1.41 )

IsGondola(0)

UnloadingStartDelay (5)


FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FreightCoal )

Shape(H_Coal.s)

MaxHeight(0.1)

MinHeight(-0.85)

FreightWeightWhenFull(26.0t-uk)

FullAtStart( 0 )

FullMaxBrakeForce ( 89.676kN )

FullMaxHandbrakeForce ( 9.964kN )

FullORTSDavis_A ( 748.61 )

FullORTSDavis_B ( 18.0157 )

FullORTSDavis_C ( 0.838530 )

FullORTSWagonFrontalArea ( 15.0m )

FullORTSDavisDragConstant ( 0.005 )

FullCentreOfGravity_Y ( 1.8 )

)

)


Beachten Sie, dass für geschlossene Waggons, wie z. B. überdachte Transporter, die Frachtanimationsform möglicherweise nicht erforderlich ist und daher die Parameter Shape, MaxHeight und MinHeight in der Datei weggelassen werden können.


Die IntakePoint-Anweisung ist erforderlich, um einen zufriedenstellenden Betrieb der Funktion sicherzustellen.


Open Rails unterstützt die folgenden Fracht- oder Treibstoffladungstypen:


• FreightGrain = 1,


• FreightCoal = 2,


• FreightGravel = 3,


• FreightSand = 4,


• FuelWater = 5,


• FuelCoal = 6,


• FuelDiesel = 7,


• FuelWood = 8,


• FuelSand = 9,


• FreightGeneral = 10,


• FreightLivestock = 11,


• FreightFuel = 12,


• FreightMilk = 13,


• SpecialMail = 14


Das Schlüsselwort, z.B. FreightMilk wird verwendet, um den Frachttyp in der IntakePoint-Anweisung zu definieren, während die Nummer verwendet wird, um den Abholpunkt in der Route zu definieren (ersetzt die erste Zahl in der PickupType-Anweisung (1 0).


Für Lastschwankungen in einer Lokomotive wird eine ähnliche Konfiguration in Bezug auf die Voll- und Leerparameter verwendet, aber da die IntakePoint-Anweisung normalerweise an anderer Stelle in der ENG-Datei oder der WAG-Datei des Tenders (oder Hilfstenders) enthalten ist, können diese Anweisungen weggelassen werden der Bereich Frachtanimation. Der folgende Codeblock würde beispielsweise auf eine Dampflokomotive zutreffen (beachten Sie das Fehlen der IntakePoint-Anweisung):


ORTSFreightAnims

(

WagonEmptyWeight(76.35t-uk)

EmptyMaxBrakeForce ( 29.892kN )

EmptyMaxHandbrakeForce ( 9.964kN )

EmptyORTSDavis_A ( 580.71 )

EmptyORTSDavis_B ( 5.0148 )

EmptyORTSDavis_C ( 0.694782 )

EmptyCentreOfGravity_Y ( 1.41 )

FreightAnimContinuous

(

FreightWeightWhenFull(10.34t-uk)

FullMaxBrakeForce ( 89.676kN )

FullMaxHandbrakeForce ( 9.964kN )

FullORTSDavis_A ( 748.61 )

FullORTSDavis_B ( 18.0157 )

FullORTSDavis_C ( 0.838530 )

FullCentreOfGravity_Y ( 1.8 )

)

)

Anmerkungen:


• Aufnahmepunkte sollten innerhalb der rootWAG-Datei definiert werden


• Annahmepunkte und Frachtanimationen sollten nicht in der INCLUDE-Datei definiert werden


• Das Leergewicht des Tenders entspricht der Gesamtmasse abzüglich des Kohle- und Wassergewichts


• FreightWeightWhenFull ist die Summe des Kohle- und Wassergewichts.


• Die vollständigen physikalischen Werte sind die Werte für das Gesamtgewicht von Tender, Wasser und Kohle.


• Die Parameter für den Windwiderstand (ORTSWagonFrontalArea und ORTSDavisDragConstant) können


weggelassen werden, wenn sich die Fläche und das Ziehen zwischen dem vollen und dem leeren Zustand nicht ändern.


Statische Waggons (statische Frachtanimationen)


Statische Waggons können mit einem vollen und leeren Zustand definiert werden, es sollte jedoch nur eine Frachtanimation vorhanden sein


die ihm zugewiesenen vollständigen Werte, da OR dann den bekannten vollständigen Zustand nicht berechnen kann.


Ein typischer Konfigurationscodeblock sieht wie folgt aus:


ORTSFreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(6.5t-uk)


FreightAnimStatic

(

SubType(Default)

Shape( 15ft_3p_HumpSheet2.s )

Offset( 0, 0, 0)

FreightWeight( 9.0t-uk )

FullMaxBrakeForce ( 19.43kN )

FullMaxHandbrakeForce ( 6.477kN )

FullORTSDavis_A ( 358.37 )

FullORTSDavis_B ( 7.7739 )

FullORTSDavis_C ( 0.718740 )

FullORTSWagonFrontalArea ( 15.0m )

FullORTSDavisDragConstant ( 0.005 )

FullCentreOfGravity_Y ( 1.8 )

)

)


Die leeren Werte für den Wagen werden aus den normalen Parametern der baseWAG-Datei gelesen.


9.4 Containerverwaltung


9.4.1 Allgemeines



Mit dieser Funktion sind Container keine statischen Objekte, die auf der Erde oder auf Waggons liegen, sondern können von einer Containerstation auf einen Waggon geladen oder von einem Waggon entladen und auf eine Containerstation gelegt werden. Die Be- und Entladevorgänge werden über einen Kran durchgeführt, der das Herzstück der Containerstation darstellt.

Die andere Komponente der Containerstation sind die Stapelplätze, also die Orte, an denen Container abgelegt werden können. Behälter gleicher Länge können übereinander gestapelt werden.


Waggons können zu Spielbeginn leer oder teilweise oder vollständig mit Containern beladen sein, indem die entsprechenden Daten entweder in die Consist-Datei (.con) oder in die .wag-Dateien eingefügt werden.


Außerdem können Containerstationen zu Spielbeginn leer oder teilweise oder vollständig mit Containern gefüllt sein, wobei die entsprechenden Daten in die Aktivitätsdatei (.act) eingefügt werden.


Die Lade- und Entladevorgänge werden vom Spieler gestartet, indem er die Taste <T> zum Laden und die Taste <Shift-T> drückt. Der Vorgang wird am ersten Waggon (ausgehend von der Lokomotive) durchgeführt, der sich im Verfahrbereich des Containerkrans befindet und die erforderlichen Bedingungen erfüllt (z. B. Laderaum zum Beladen vorhanden, Container zum Entladen vorhanden).


Es werden Doppelstockwagen verwaltet.


Aus Sicht der internen Codestruktur behandelt Open Rails Containerstationen als spezielle Pickups.


9.4.2 So definieren Sie Containerdaten


Container-Shape-Dateien (.s) müssen sich in Unterordnern (oder Unter-Unterordnern) des Trainset-Ordners befinden. Verwaltbare Container müssen mit einer Json .load-or-Datei versehen sein. Die .load-or-Dateien müssen sich in einem Unterordner des Trainset-Ordners befinden. Es wird dringend empfohlen, alle .load-or-Dateien in einem einzigen Ordner aufzubewahren: Common.ContainerData wird empfohlen. Es wird außerdem empfohlen, die .load-or-Dateien einheitlich zu benennen: 40HCtriton.load-or wird empfohlen, wobei 40HC der Containertyp und triton die auf dem Container aufgemalte Marke ist.


Format der .load-or-Datei


Hier unten ein Beispiel einer .load-or-Datei:


{

"Container":

{

"Name" : "triton",

"Shape" : "COMMON_Container_3d\\Cont_40ftHC\\container-40ftHC_Triton.s",

"ContainerType" : "C40ftHC",

"IntrinsicShapeOffset": [0,1.175,0],

"EmptyMassKG": 2100.,

"MaxMassWhenLoadedKG": 28000.,

}

}


• „Container“ ist ein festes Schlüsselwort.


• „Name“ hat als Wert eine Zeichenfolge, die von Open Rails verwendet wird, wenn der Container in einer Nachricht an den Spieler identifiziert werden muss.


• „Shape“ hat als Wert den Pfad der Containerform mit Trainset als Basis.


• „ContainerType“ identifiziert den Containertyp, der einer der folgenden sein kann:


* C20ft

* C40ft

* C40ftHC

* C45ft

* C45ftHC

* C48ft

* C53ft


C48ft und C53ft haben eine HC-Höhe (2,90 m)


• „IntrinsicShapeOffset“ hat als Wert den Versatz in Metern der Mitte des unteren Rechtecks des Containers in Bezug auf die Koordinaten der Container-Shape-Datei. Leider ist dieser Offset oft nicht [0,0,0], was für neu produzierte Container ratsam wäre. Eine einfache Möglichkeit, einen solchen Versatz anzugeben, besteht darin, die Option „Begrenzungsinformationen anzeigen“ des Shape Viewers zu verwenden.


• „EmptyMassKG“ ist ein optionaler Parameter, der die Tara (Leergewicht) des Behälters definiert. Wenn der Parameter nicht vorhanden ist, verwendet OR einen Standardparameter, der für diesen ContainerType spezifisch ist.


• „MaxMassWhenLoadedKG“ ist ein optionaler Parameter, der die Summe aus Tara plus der maximal zulässigen Nutzlast definiert. Wenn der Parameter wie oben nicht vorhanden ist, verwendet OR einen Standardparameter, der für diesen ContainerType spezifisch ist.


9.4.3 Voreinstellen einer .wag-Datei zur Aufnahme von Containern


Für einen Doppelstapler muss mindestens folgender Block in der .wag-Datei vorhanden sein:


ORTSFreightAnims (

WagonEmptyWeight ( 12.575t )

LoadingAreaLength ( 12.20 )

AboveLoadingAreaLength ( 12.20 )

DoubleStacker ()

Offset( 0 0.34 0 )

IntakePoint ( 0 6.0 Container)

)


• WagonEmptyWeight ist das Gewicht des Waggons, wenn dieser weder Container noch andere wiegende Frachtanimationen an Bord hat


• LoadingAreaLength ist die Länge der für Container verfügbaren Ladefläche in Metern


• AboveLoadingAreaLength ist die Länge in Metern der oben für Container verfügbaren Ladefläche (Parameter nicht erforderlich, wenn es sich nicht um einen Doppelstapler handelt).


• DoubleStacker muss vorhanden sein, wenn der Wagen eine Doppelstapelung zulässt


• Versatz ist der Versatz der Mitte des Rechtecks der Ladefläche in Bezug auf die Formdatei des Wagens.


• Der erste und der dritte IntakePoint-Parameter haben dieselben Bedeutungen wie die für generische Pickups. Der erste Parameter muss dem Z-Wert des Versatzes entsprechen. Container ist Pflicht. Dieser ORTSFreightAnims-Block kann auch statische Frachtanimationen enthalten, wie im entsprechenden Absatz beschrieben.


9.4.4 Aufteilung der Container auf die Waggons


Ein Container kann innerhalb der Ladefläche des Wagens folgende Positionen haben: Hinten, Mitte Hinten, Mitte, Mitte Vorne, Vorne und Oben. Das folgende Bild zeigt, wo sich die ersten fünf Positionen am Wagen befinden, während Oben die obige Position in Dual-Stack-Konfigurationen zeigt. Die obige Position ist immer zentriert.

Einige Ladekonfigurationen sind im folgenden Bild dargestellt:

Von links nach rechts sind die Ladekonfigurationen dargestellt (Lokomotive links):


• CenterFront, CenterRear, Above


• Center


• Vorne hinten


• Vorne, Mitte, Hinten


• Vorne hinten


• Vorne, Mitte vorne, Mitte hinten, hinten.


Die tatsächlichen Regeln für die Zuteilung doppelt gestapelter Container müssen beachtet werden:


• Keine 20 Fuß übereinander gestapelt


• Nur ein Container oben


• mindestens 40 Fuß Container darunter.


9.4.5 So verteilen Sie Container zu Beginn des Spiels auf Waggons



Die Zuweisung der Container kann entweder durch Bearbeiten der .con-Datei oder durch Bearbeiten der .wag-Datei oder in einem gemischten Modus (einige Waggons in einem Modus, andere in einem anderen Modus) erfolgen.


Zuordnung über .con-Datei


Dieser Zuordnungsmodus wird empfohlen, da er flexibler ist und eine einfachere Sichtbarkeit bietet.


Hier wird ein Waggoneintrag mit den Daten zu den beim Start verladenen Containern angezeigt:


Wagon (

WagonData ( DTTX_620040_A ATW.DTTX_620040 )

LoadData ( 20cmacgm common.containerdata CenterFront Empty)

LoadData ( 20hamburgsud common.containerdata CenterRear Loaded)

LoadData ( 40msc common.containerdata Above Random)

UiD ( 11 )

)


Wie ersichtlich ist, muss für jeden beim Start geladenen Container ein LoadData-Eintrag vorhanden sein. Die Bedeutung der Parameter ist wie folgt:


• Der erste Parameter ist der Name der .load-or-Datei


• Der zweite Parameter ist der Pfad (mit Trainset als Basispfad), in dem sich die .load-or-Datei befindet


• Der dritte Parameter gibt an, wo der Container auf dem Waggon zugeordnet ist


• Der vierte Parameter, der optional ist, definiert den Beladungszustand des zugehörigen Containers, aus dem das Gewicht des Containers abgeleitet wird. Wenn Empty vorhanden ist, wird das Gewicht des leeren Behälters als tatsächliches Gewicht verwendet; wenn Loaded vorhanden ist, wird das maximale Gewicht (Tara + Nutzlast) des Containers verwendet; Wenn Random vorhanden ist, wird das Gewicht wie folgt berechnet: Es wird eine Zufallszahl zwischen 0 und 100 generiert. Liegt die Zahl unter 31, gilt der Behälter als leer; andernfalls wird die Zahl als Prozentsatz des Maximalgewichts des Containers (Tara + Nutzlast) verwendet. Das Gewicht der Container wird zum Leergewicht des Wagens addiert, um das Gesamtgewicht des Wagens zu berechnen. Wenn der Parameter nicht vorhanden ist, wird der Zufallswert angenommen.


Der Eintrag für den oben zugewiesenen Container muss der letzte sein.


Die Einträge „CenterFront“ und „CenterRear“ müssen nach den Einträgen „Front“ oder „Rear“ eingegeben werden.


Der Vorteil dieser Art der Zuordnung besteht darin, dass für eine einzelne WAG-Datei (im Beispiel DTTX_620040_A.wag) mehr mögliche Containerkonfigurationen möglich sind, wodurch die Zeit für die Erstellung vieler WAG-Dateien gespart wird, die sich nur in den geladenen Containern unterscheiden.


Hier unten ein Bild mit einem Beispieleintrag in der .con-Datei:

Zuordnung über .wag-Datei


Content-Ersteller ziehen es möglicherweise vor, Pakete mit vorbeladenen Waggons bereitzustellen. Daher ist es auch möglich, in der .wag-Datei festzulegen, welche Container beim Start geladen werden sollen.


Ein minimaler FreightAnimations-Eintrag in einer .wag-Datei, um denselben vorinstallierten Containersatz wie im vorherigen Absatz zu haben, lautet wie folgt:


ORTSFreightAnims (

WagonEmptyWeight ( 12.575t )

LoadingAreaLength ( 14.6 )

AboveLoadingAreaLength ( 16.15 )

DoubleStacker ()

Offset( 0 0.34 0 )

IntakePoint ( 0 6.0 Container)

LoadData ( 20cmacgm common.containerdata CenterFront Empty)

LoadData ( 20hamburgsud common.containerdata CenterRear Loaded)

LoadData ( 40msc common.containerdata Above Random)

)


Wie man sieht, ist die Syntax der LoadData-Einträge dieselbe wie im Fall der .con-Datei. Auch hier ist der vierte Parameter optional.


Bei der Verwendung von .wag-Dateien für diese Art von Informationen muss natürlich für jeden gewünschten vorinstallierten Containersatz eine andere .wag-Datei erstellt werden.


Eine einzelne .con-Datei kann Wagon-Einträge für beide Arten der Zuordnungsdefinition enthalten.


9.4.6 Containerstation


Die Containerstation besteht aus einem Containerkran und einem Containerstapelbereich.


Um eine Containerstation in eine Route einzufügen, muss ihr Objekt in der .ref-Datei als Pickup-Objekt vorhanden sein. Ein Beispiel für einen .ref-Dateieintrag sieht wie folgt aus:


Pickup (

Class ( "Animated loader" )

Filename ( RMG_45.s )

PickupType ( _FUEL_COAL_ )

Description ( "Animated container crane" )

)


PickupType ist auf _FUEL_COAL eingestellt, aber dies wird durch die Daten überschrieben, die in die Erweiterungsdatei .w (siehe hier) im Openrails-Unterordner des World-Ordners eingefügt werden.


Eine solche Datei mit der Erweiterung .w besteht aus einem allgemeinen Teil, einem Teil, der sich auf den Containerkran bezieht, und einem Teil, der sich auf die Stapelstandorte bezieht, wie im folgenden Beispiel (durch Leerzeilen getrennte Teile).


SIMISA@@@@@@@@@@JINX0w0t______


Tr_Worldfile (

Pickup (

UiD ( 21 )

PickupType ( 15 1 )

ORTSPickingSurfaceYOffset ( 2.25 )

ORTSPickingSurfaceRelativeTopStartPosition ( 0 6.75 0 )

ORTSGrabberArmsParts ( 2 )

ORTSCraneSound ( "ContainerCrane.sms" )

ORTSMaxStackedContainers ( 2 )

ORTSStackLocationsLength ( 12.19 )

ORTSStackLocations ( 12

StackLocation (

Position ( -10 0 26 )

Length ( 16.15 )

)

StackLocation (

Position ( -10 0 26 )

MaxStackedContainers ( 1 )

Flipped ( 1 )

)

StackLocation (

Position ( -10 0 0 )

MaxStackedContainers ( 2 )

)

StackLocation (

Position ( -10 0 0 )

Flipped ( 1 )

)

StackLocation (

Position ( -10 0 -26 )

)

StackLocation (

Position ( -10 0 -26 )

Flipped ( 1 )

Length ( 16.15 )

)

StackLocation (

Position ( -7 0 26 )

Length ( 16.15 )

)

StackLocation (

Position ( -7 0 26 )

Flipped ( 1 )

)

StackLocation (

Position ( -7 0 0 )

)

StackLocation (

Position ( -7 0 0 )

Flipped ( 1 )

)

StackLocation (

Position ( -7 0 -26 )

)

StackLocation (

Position ( -7 0 -26 )

Flipped ( 1 )

Length ( 16.15 )

)

)

)

)


• Die UiD-Nummer muss mit der UID-Nummer übereinstimmen, die der Pickup in der Haupt-.w-Datei hat.


• PickupType ( 15 1 ) identifiziert diesen Pickup als Containerstation.


In einer solchen Erweiterungsdatei kann mehr als ein Pickup()-Block vorhanden sein, einer für jede auf der Route vorhandene Containerstation.


Die auf den Containerkran und den Stapelstandort bezogenen Daten werden unten an geeigneter Stelle beschrieben.


Entwicklungsregeln für Formdateien für Containerstationen (einschließlich Containerkran).


• Die Z-Achse der Formdatei muss mit dem Gleis ausgerichtet sein, auf dem sich die zu be- oder entladenden Waggons befinden.


• Der Z-Nullpunkt der Formdatei muss in der Mitte des Segments liegen, das der Kran bei seiner Bewegung abdecken kann (z. B. könnte die Z-Spannweite des Krans -30 bis 30 Meter betragen).


• Die Animation des Teils des Krans, der sich entlang der Z-Achse bewegt, muss ZAXIS heißen.


• Die Animation des Teils des Krans, der sich quer entlang der X-Achse bewegt, muss XAXIS heißen und hierarchisch von ZAXIS abhängig sein.


• Die Animation des Teils des Krans, der sich vertikal entlang der Y-Achse bewegt, muss YAXIS heißen und hierarchisch von XAXIS abhängig sein.


• Die Greifer sind die ausfahrbaren Arme, die den Behälter aufnehmen. Im einfachsten Fall gibt es zwei Abschnitte, einen, der sich in Richtung des positiven Z für längere Behälter erstreckt, und einen, der sich in Richtung des negativen Z erstreckt. Der erste muss GRABBER01 und der zweite GRABBER02 heißen. Beide müssen hierarchisch von YAXIS abhängig sein. Im komplexesten Fall besteht jeder der beiden „Arme“ aus zwei Teilen, die sich wie ein Teleskop bewegen. Dieses zweite Armpaar muss GRABBER01_O2 und GRABBER02_02 heißen. Sie müssen hierarchisch von GRABBER01 und GRABBER02 abhängig sein. Die Spannen von GRABBER01 und GRABBER02 müssen symmetrisch sein, und das Gleiche gilt für die anderen Spannenpaare. Außerdem müssen die Spannweiten von GRABBER01 und GRABBER01_02 gleich sein (und symmetrisch auch die anderen Paare).


• Die Namen der Kabelteile, die eine teilweise autonome Bewegung entlang der Y-Achse ausführen (um das Auf- und Abwickeln des Kabels zu simulieren), müssen mit CABLE beginnen und hierarchisch von YAXIS abhängig sein.


Das folgende Diagramm aus Shape Viewer fasst die oben genannten Regeln zusammen.

Im Folgenden sind die wesentlichen Animationseinträge der Formdatei eines Krans aufgeführt:


animations ( 1

animation ( 2 30

anim_nodes ( 30

anim_node MAIN (

controllers ( 0 )

)

...

anim_node ZAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -139.5 )

linear_key ( 12 0 0 139.5 )

linear_key ( 24 0 0 -139.5 )

)

)

)

anim_node XAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 0 )

linear_key ( 3 26.4 0 0 )

linear_key ( 6 0 0 0 )

)

)

)

...

anim_node YAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 11.7 0 )

linear_key ( 2 0 0 0 )

linear_key ( 4 0 11.7 0 )

)

)

)

anim_node GRABBER02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -2.515 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 -2.515 )

)

)

)

anim_node GRABBER02_02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -2.513 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 -2.513 )

)

)

)

anim_node GRABBER01 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 2.515 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 2.515 )

)

)

)

anim_node GRABBER01_02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 2.513 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 2.513 )

)

)

)

...

anim_node CABLE02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 22.32 0 )

linear_key ( 1 0 15.72 0 )

linear_key ( 2 0 22.32 0 )

)

)

)

...

)

)

)


Es ist zu beachten, dass die Frameanzahl für verschiedene Animationsknoten unterschiedlich ist, z. B. Die ZAXIS hat 0, 12, 24. Dadurch kann die Bewegungsgeschwindigkeit entlang dieser Achse auf einen realistischen Wert herunterskaliert werden.


Parameter der Dateierweiterung .w, die sich auf den Kran und seine Animationen beziehen


• ORTSPickingSurfaceYO set ( 0.0 ): der Y-Versatz der Unterseite der Greifer (diejenige, die mit der Oberseite des Containers in Kontakt kommt), wenn YAXIS gleich 0 ist


• ORTSPickingSurfaceRelativeTopStartPosition ( 0 11.7 0 ): die Werte von XAXIS, YAXIS und ZAXIS zu Beginn des Spiels (sollten auf der Z-Achse zentriert sein, über den Schienen und auf höchster Höhe)


• ORTSGrabberArmsParts ( 4 ): ist 4, wenn alle vier Animationen GRABBER01, GRABBER02, GRABBER01_02 und GRABBER02_02 vorhanden sind; ist 2, wenn es nur GRABBER01 und GRABBER02 gibt


• ORTSCraneSound („ContainerCrane.sms“): Name und Pfad der Kran-Sounddatei; der Pfad basiert auf dem SOUND-Ordner der Route; Wenn die Datei dort nicht gefunden wird, basiert der Pfad auf dem SOUND-Ordner von TRAIN SIMULATOR. Die spezifischen verfügbaren diskreten Tonauslöser sind hier aufgelistet.


Stapelstandorte


Innerhalb des vom Containerkran erreichbaren Bereichs (Schienenabstand) können in der Dateierweiterung .w Stapelplätze definiert werden, an denen die Container abgelegt werden können.


Die Stapelplätze werden durch folgende Parameter definiert:


• Position: die Koordinaten des Mittelpunkts einer der kurzen Seiten des Stapelstandorts; Wenn keine umgedrehte (1) Linie vorhanden ist, erstreckt sich der Ortsbereich in Richtung der zunehmenden Z-Achse. Wenn stattdessen eine solche Linie vorhanden ist, erstreckt sich der Ortsbereich in Richtung der abnehmenden Z-Achse. Wenn zwei Stapelplätze die gleiche Position haben und einer umgedreht ist und der andere nicht, werden die Behälter Rücken an Rücken angeordnet, wodurch der Platzbedarf optimiert wird.


• Länge: die maximale Länge der Container, die auf diesem Stapelplatz abgelegt werden können


• MaxStackedContainers: Die maximale Anzahl an Containern, die auf diesem Stapelplatz übereinander gestapelt werden können


Die Parameter „Length“ und „MaxStackedContainers“ sind optional und überschreiben, sofern vorhanden, die Standardwerte in ORTSStackLocationsLength und ORTSMaxStackedContainers.


Wenn ORTSStackLocationsLength größer oder gleich 12,20 m ist, was der doppelten Länge eines 20-Fuß-Containers entspricht, wendet Open Rails eine Platzoptimierungsstrategie an: für jeden Stapelstandort (nennen wir ihn den Hauptstapelstandort) einen anderen (nennen wir ihn den untergeordneten Stapelstandort). Stapelstandort) wird an einer Position mit einem Z-Wert erstellt, der 6,095 m größer ist als der Mutterstapelstandort (wenn letzterer umgedreht wird, ist der Z-Wert 6,095 m kleiner). Dieser untergeordnete Stapelplatz kann nur von einem 20-Fuß-Container belegt werden und auch nur, wenn der Mutter-Stackplatz leer ist oder ebenfalls von einem 20-Fuß-Container belegt ist. Der untergeordnete Stapelspeicherort hat einen Index, der gleich ist


Index der Mutter-Stack-Standorte plus die Gesamtzahl der Mutter-Stack-Standorte. Sobald sowohl der Mutter- als auch der Kind-Stapelplatz leer sind, steht der Mutter-Stapelplatz wieder für jede Art von Container geeigneter Länge zur Verfügung.


Es folgt ein weiteres Beispiel für einen Stapelplatzzuordnungscode und sein physisches Gegenstück in der Containerstation. Es ist zu erkennen, dass sich auf dem Stapelplatz 0 ein 20-Fuß-Container befindet, ebenso wie auf dem untergeordneten Stapelplatz 10. Dasselbe gilt für Stapelplatz 3 und dessen untergeordneten Stapelplatz 13.

Bevölkerung der Containerstationen zu Spielbeginn


Containerstationen können zu Spielbeginn bevölkert werden. Dies geschieht durch Einfügen einer .load-stations-loads-or-Datei in den Openrails-Unterordner des Ordners „Activities“ der Route und Einfügen der folgenden Zeile am Ende des Tr_Activity_Header in .act-Dateien


ORTSLoadStationsPopulation ( BigContainerStationPopulation )


Dabei ist BigContainerStationPopulation der Name der .load-stations-loads-or-Datei. Im Moment ist das Auffüllen zu Beginn des Spiels nur im Aktivitätsmodus möglich.


Die Datei .load-stations-loads-or ist eine JSON-Datei. Ein Beispiel ist hier unten dargestellt


"ContainerStationsPopulation": [

{

"LoadStationID" : { "wfile" : "w-005354+014849.w", "UiD" : 21, },

"LoadData" : [

{ "File" : "40HCcai", "Folder" : "common.containerdata",

˓→"StackLocation" : 0, "LoadState" : "Empty"},

{ "File" : "40HCcai", "Folder" : "common.containerdata",

˓→"StackLocation" : 0, "LoadState" : "Loaded"},

{ "File" : "20cmacgm", "Folder" : "common.containerdata",

˓→"StackLocation" : 2, "LoadState" : "Random"},

{ "File" : "20kline", "Folder" : "common.containerdata",

˓→"StackLocation" : 2, },

{ "File" : "45HCtriton", "Folder" : "common.containerdata",

˓→"StackLocation" : 5, },

{ "File" : "45HCtriton", "Folder" : "common.containerdata",

˓→"StackLocation" : 5, },

{ "File" : "48emp", "Folder" : "common.containerdata",

˓→"StackLocation" : 6, },

{ "File" : "20maersk", "Folder" : "common.containerdata",

˓→"StackLocation" : 14, },

{ "File" : "20maersk3", "Folder" : "common.containerdata",

˓→"StackLocation" : 14, },

]

},

{

"LoadStationID" : { "wfile" : "w-005354+014849.w", "UiD" : 210, },

"LoadData" : [

...

]

},

...

]

}


Die Datei kann die Bevölkerung beim Start vieler Containerstationen definieren.


• Die LoadStationID enthält die Informationen, die zur Identifizierung der Containerstation erforderlich sind.


• Das LoadData-Array enthält die Daten zum Auffüllen der Containerstation.


• Der Wert von File ist der Name der .load-or-Datei, die den Container identifiziert.


• Der Wert von Folder ist der Pfad, in dem die .load-or-Datei gefunden werden kann, beginnend mit dem TRAINSET.


• Der Wert von StackLocation ist der Index des Stack-Standorts. Wenn der Index gleich oder größer als die Anzahl der in der Erweiterungsdatei .w definierten Stapelspeicherorte ist, verweist der Index auf einen untergeordneten Stapelspeicherort.


• Wenn für einen Stapelplatz mehr als ein Behälter definiert ist, werden diese übereinander gestapelt.


• Der LoadState-Parameter ist optional und hat dieselbe Bedeutung und dieselben Werte wie der gleichnamige Parameter, der in .con- oder .wag-Dateien vorhanden sein kann.


Die Containerstations-Bestückungsdatei muss unter Berücksichtigung der Einschränkungen der Stapelplätze geschrieben werden (Containerlänge muss kleiner sein als die Länge des Stapelplatzes, gestapelte Container dürfen die zulässige Anzahl nicht überschreiten, ein Stapelplatz muss Container gleicher Länge enthalten).


9.5 Mehrere Passagierperspektiven


Innerhalb eines Wagens, der mit einem Passagier-Perspektivpunkt ausgestattet ist, können zusätzliche Passagier-Perspektivpunkte hinzugefügt werden.


Solche zusätzlichen Passagiersichtpunkte werden in einer Include-Datei mit dem im folgenden Beispiel gezeigten Format für den alten MSTS-Wagen oebarcar.wag (im Ordner 380) definiert:


include ( ../oebarcar.wag )

Wagon (

ORTSAlternatePassengerViewPoints (

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( -0.0 2.85801 -6.091 )

RotationLimit ( 50 270 0 )

StartDirection ( 0 0 0 )

)

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( -0.5 2.35801 -1.791 )

RotationLimit ( 50 270 0 )

StartDirection ( 0 0 0 )

)

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( 0.9 2.35801 -1.791 )

RotationLimit ( 50 270 0 )

StartDirection ( -5 -90 0 )

)

)

)


Zur Laufzeit kann der Spieler in der Passagieransicht durch Drücken von Umschalt-5 von einem Aussichtspunkt zum anderen wechseln.


9.6 Glockenanimation


Open Rails unterstützt Glockenanimationen. Die Glockenanimationsmatrix muss in der .s-Datei der Engine den Namen ORTSBELL tragen. Die Standardbildrate beträgt 8 Bilder pro Sekunde. Die Standardbildrate kann über den optionalen Parameter ESD_ORTSBellAnimationFPS (n) geändert werden, der in die .sd-Datei eingefügt wird, die mit der .s-Datei verknüpft ist. n definiert die Animations-FPS. Es empfiehlt sich, den zugehörigen Soundstream in der SMS-Datei mit der sichtbaren Animation zu synchronisieren. Um dies zu erreichen, sollte die WAV-Datei zwei Glockenschläge enthalten, deren Zeitintervall dem Zeitintervall eines Glockenschlags von einem Schwingungsendpunkt zum gegenüberliegenden Endpunkt entspricht. Da der erste Glockenschlag nicht sofort beginnen sollte, sondern wenn die Glocke ungefähr das Maximum des Schwingens erreicht hat, sollte der erste Schlag in der WAV-Datei den Zeitabstand haben, der der Schwingung vom Mittelpunkt bis zum Endpunkt der Schwingung entspricht. Die Datei sollte einen Cue-Punkt am Anfang und einen nach dem Zeitintervall eines vollständigen Vor- und Zurückschwingens der Glocke haben und für ein optimales Ergebnis über einen abschließenden Fadeoff verfügen.


9.7 Kupplungs- und Luftschlauchanimation


Open Rails unterstützt die Animation von Kupplungen und Luftschläuchen. Die Kupplungsanimation bewegt die Kupplungen und Luftschläuche, während sich der Zug bewegt und der Kupplungsspielraum zunimmt oder abnimmt. Die Kupplungen drehen sich auch, wenn der Zug um eine Kurve fährt.


Zur Umsetzung müssen separate Modelle für die Kupplungen und Luftschläuche bereitgestellt werden. Es wird ein separates Modell für den gekoppelten und den ungekoppelten Zustand vorgeschlagen.


Um die Koppleranimation zu aktivieren, müssen die folgenden Parameter in den Kopplercodeabschnitt der WAG-Datei aufgenommen werden:


FrontCouplerAnim – Kopplerform, die beim Koppeln an der Vorderseite des Fahrzeugs angezeigt wird.


FrontCouplerOpenAnim – Kopplerform, die an der Vorderseite des Fahrzeugs angezeigt wird, wenn es abgekoppelt ist.


RearCouplerAnim – Kopplerform, die beim Koppeln am Heck des Fahrzeugs angezeigt wird.


RearCouplerOpenAnim – Kopplerform, die am Heck des Fahrzeugs angezeigt wird, wenn es abgekoppelt ist


Alle vier oben genannten Punkte haben das folgende Format:


CouplerAnimation ( Couplershape.s, x, y, z ), wobei der Name der Coupler-Shape-Datei zusammen mit x-, y- und z-Werten enthalten ist, die den Coupler in den drei Achsen versetzen.


Für die Luftschlauch-Animation müssen die folgenden Parameter im Koppler-Code-Abschnitt der WAG-Datei enthalten sein:


FrontAirHoseAnim – Luftschlauchform, die beim Ankoppeln an der Vorderseite des Fahrzeugs angezeigt wird. FrontAirHoseDisconnectedAnim – Luftschlauchform, die an der Vorderseite des Fahrzeugs angezeigt wird, wenn es abgekoppelt ist. RearAirHoseAnim – Luftschlauchform, die beim Ankoppeln am Heck des Fahrzeugs angezeigt wird. RearAirHoseDisconnectedAnim – Luftschlauchform, die am Heck des Fahrzeugs angezeigt wird, wenn es abgekoppelt ist.


Jeder dieser Parameter hat das gleiche Format wie oben für die Kopplerformen angegeben.


Open Rails verwendet einige Standardwerte, um die erforderliche Bewegung und Winkel für die Bewegung der Kupplung und der Luftschlauchform zu berechnen. Für eine höhere Genauigkeit kann der Modellierer jedoch spezifische Werte wie ORTSLengthAirHose hinzufügen. Zusätzlich sollten auch die im Entgleisungskoeffizienten vorgeschlagenen Längenwerte hinzugefügt werden.


9.8 Einstiegstüren


Beifahrertüren werden (standardmäßig) mit den Tasten <Q> und <Umschalt+Q> geöffnet und geschlossen. Es ist möglich, Öffnungs- und Schließverzögerungen hinzuzufügen, was nützlich sein kann, um die Anzeige „Türen geschlossen“ zu verzögern, bis alle Türen vollständig geschlossen sind. Die Verzögerungen können hinzugefügt werden, indem der folgende Block in den Wagenabschnitt einer beliebigen ENG- oder WAG-Datei eingefügt wird:


ORTSDoors (

ClosingDelay ( 5s )

OpeningDelay ( 1s )

)


9.9 C#-Engine-Skripting


Um besonders komplexes Verhalten zu simulieren, stellt Open Rails für eine Reihe von Systemen auf der Player-Lokomotive eine C#-Skriptschnittstelle zur Verfügung. Wie das Open Rails-Programm selbst werden diese Skripte in CS-Dateien geschrieben, die C#-Klassen enthalten. Sie werden jedoch zur Laufzeit kompiliert und verknüpft, sodass sie nicht von Änderungen im Kernprogramm selbst abhängig sind und mit Inhalten für rollendes Material verteilt werden können. Skripte werden ausgeführt, wenn sie durch OR-spezifische Felder in der .eng-Datei referenziert werden.


Tabelle 1: Derzeit skriptfähige Lokomotivsysteme

System C#-Klasse .eng-Block
Zugbremssteuerung ORTS.Scripting.Api. BrakeController Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )
Motorbremssteuerung ORTS.Scripting.Api. BrakeController Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )
Leistungsschalter ORTS.Scripting.Api. CircuitBreaker Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )
Traktionsunterbrechungsrelais ORTS.Scripting.Api. TractionCutOffRelay Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) ) ( ORTSTractionCutOffRelay ( "DemoRelay.cs" ) )
Motorstromversorgung ORTS.Scripting.Api. DieselPowerSupply Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) ) ( ORTSPowerSupply ( "DemoPower.cs" ) )
Stromversorgung ORTS.Scripting.Api. ElectricPowerSupply Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )
Passenger car power supply ORTS.Scripting.Api. PassengerCarPowerSupply Waggon ( ORTSPowerSupply ( "DemoPower.cs" ) )
Zugsteuerungssystem ORTS.Scripting.Api. TrainControlSystem Lokomotive ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )

Skripte befinden sich in einem Skript-Unterordner im Engine-Ordner und müssen eine Klasse enthalten, die nach dem eigenen Dateinamen des Skripts benannt ist. Wenn der Dateiname des Skripts beispielsweise „AmtrakTCS.cs“ lautet, sucht OR nach einer einzelnen Klasse mit dem Namen „AmtrakTCS“. (Es ist auch möglich, das Skript an einem anderen Ort zu platzieren, z. B. in einem Common.Script-Ordner im TRAINSET-Ordner, indem die entsprechende Anzahl übergeordneter Verzeichnistoken ..\ relativ zum Skriptordner der Engine vorangestellt wird.) Der Code des Skripts wird weiter ausgeführt der UpdaterProcess-Thread. Dieses Beispiel, das in einer Datei mit dem Namen DemoTCS.cs abgelegt werden müsste, veranschaulicht den für ein Train Control System-Skript erforderlichen Mindestcode:


using System;

using ORTS.Scripting.Api;

namespace ORTS.Scripting.Script

{

class DemoTCS : TrainControlSystem

{

public override void HandleEvent(TCSEvent evt, string message) {}

public override void Initialize()

{

Console.WriteLine("TCS activated!");

}

public override void SetEmergency(bool emergency) {}

public override void Update() {}

}

}


Beachten Sie, dass sich die Klasse des Skripts im Namespace ORTS.Scripting.Script befinden muss und dass sie eine Unterklasse der abstrakten Klasse des gewünschten Systems ist. Es verweist auch auf externe Assemblys mit using-Direktiven. OR stellt Skripten die folgenden .NET-Assemblys zur Verfügung:


• System


• System.Core


• ORTS.Common


• Orts.Simulation


Skripte kommunizieren mit dem Simulator, indem sie Methoden in der Basisklasse aufrufen. Dieses Skript könnte beispielsweise die TrainLengthM()-Methode der TrainControlSystem-Klasse aufrufen, die die Länge des Spielerzugs zurückgibt. Weitere Methoden sind in der Klasse ORTS.Scripting.Api.AbstractScriptClass verfügbar, von der TrainControlSystem selbst eine Unterklasse ist.


Wenn schließlich ein Skript einen Syntax- oder Tippfehler enthält, protokolliert OR während des Ladevorgangs eine Ausnahme und führt die Simulation ohne diese aus.


9.9.1 Skripte mit Visual Studio entwickeln


Während es durchaus möglich ist, Skripte mit einem Nur-Text-Editor zu entwickeln, sorgen die in einer IDE wie Visual Studio verfügbaren Codevervollständigungs- und Debugging-Hilfen für ein wesentlich komfortableres Programmiererlebnis. Wenn Sie eine Entwicklungsumgebung zum Erstellen von Open Rails eingerichtet haben, können Sie diese mit Visual Studio bearbeiten


Skripte mit diesem Komfort. Im Folgenden finden Sie einen empfohlenen Arbeitsablauf:


1. Erstellen Sie zunächst in Ihrer Kopie des OR-Quellcodes eine Kopie Ihrer Source\ORTS.sln-Datei. Behalten Sie es im Ordner „Source\“, aber geben Sie ihm einen neuen Namen wie „ORTS_Scripts.sln“. (Sie könnten auch die ursprüngliche ORTS-Lösung ändern, müssen dann aber daran denken, sie nicht in die Quellcodeverwaltung einzuchecken.) Fügen Sie der Lösung ein neues Projekt hinzu und wählen Sie das leere .NET-Projekt aus.


2. Legen Sie im Konfigurationsdialog fest, dass das neue Projekt zur vorhandenen Lösung hinzugefügt werden soll, legen Sie als Speicherort den Ordner der Engine fest, für die Sie ein Skript erstellen, und legen Sie als Namen „Skript“ fest. (Im Moment müssen Sie „Skript“ verwenden, aber Sie können das Projekt nach der Erstellung umbenennen.) Sie können die .NET Framework-Version auf den Standardwert setzen. Erstellen Sie dann das Projekt.

3. Der neue Projektordner wird genau zum Skript-Unterordner, den OR nach Skripten durchsucht. Fügen Sie Verweise auf die ORTS.Common- und Orts.Simulation-Assemblys hinzu, um IntelliSense-Funktionen in Ihrem Editor zu aktivieren, wenn Sie Skripts bearbeiten. Sie können das Projekt nun beliebig umbenennen (wodurch der Ordner nicht umbenannt wird) und die vorgenerierte App.config-Datei löschen.

4. Öffnen Sie abschließend den Build-Konfigurationsmanager und stellen Sie das neue Skriptprojekt so ein, dass weder für die Debug- noch für die Release-Konfiguration erstellt wird.

Mit diesem Setup führt Visual Studio eine Typprüfung Ihrer Skripte durch und macht Vorschläge, wenn Sie die Open Rails-API verwenden. Sie können in Ihrem Skript auch Haltepunkte festlegen, die von RunActivity.exe abgefangen werden, wenn es in Visual Studio ausgeführt wird.

Beachten Sie, dass Visual Studio relative Pfade verwendet. Wenn Sie also jemals Ordner verschieben, müssen Sie die Verweise manuell korrigieren.


9.9.2 Bremsensteuerung


Das Bremssteuerungsskript passt das Verhalten der Zugbremsen an und ermöglicht so eine wesentlich höhere Systemgenauigkeit im Vergleich zu dem, was mit dem von MSTS übernommenen Modell möglich ist. Zu diesem Zweck kann das Skript den Zustand der Bremssteuerung auslesen und die Luftdrücke der Bremsbehälter einstellen.


Verwenden Sie den folgenden .eng-Parameter, um ein Bremssteuerungsskript zu laden:


Engine (

ORTSTrainBrakeController ( "YourBrakes.cs" )

)


or:


Engine (

ORTSEngineBrakeController ( "YourBrakes.cs" )

)


Die Erweiterung .cs ist optional. „MSTS“ lädt die standardmäßige MSTS-kompatible Implementierung, daher nicht verwenden


Geben Sie diesen Namen für Ihr eigenes Skript ein.


9.9.3 Leistungsschalter


Nur für Elektrolokomotiven verfügbar. Das Leistungsschalter-Skript steuert das Verhalten der Lokomotive


Leistungsschalter.


Verwenden Sie den folgenden .eng-Parameter, um ein Leistungsschalterskript zu laden:


Engine (

ORTSCircuitBreaker ( "YourCB.cs" )

ORTSCircuitBreakerClosingDelay ( 2s )

)


ORTSCircuitBreaker bezieht sich auf das Circuit-Breaker-Skript im Script-Unterordner der Engine. Für dieses Feld ist die Erweiterung .cs optional. „Automatisch“ und „Manuell“ laden die generische OR-Leistungsschalterimplementierung, verwenden Sie diese Namen also nicht für Ihr eigenes Skript.


ORTSCircuitBreakerClosingDelay bezieht sich auf die Verzögerung zwischen dem Schließbefehl des Leistungsschalters und dem tatsächlichen Schließen des Leistungsschalters.


9.9.4 Traktionsunterbrechungsrelais


Nur für Brennkraftlokomotiven verfügbar. Das Traktionsabschaltrelais-Skript steuert das Verhalten der Lokomotive


Traktionsunterbrechungsrelais.


Verwenden Sie den folgenden .eng-Parameter, um ein Traktionsabschaltrelais-Skript zu laden:


Engine (

ORTSTractionCutOffRelay ( "YourTCOR.cs" )

ORTSTractionCutOffRelayClosingDelay ( 2s )

)


ORTSTractionCutOffRelay bezieht sich auf das Traktionsabschaltrelais-Skript im Unterordner „Script“ der Engine. Für dieses Feld ist die Erweiterung .cs optional. „Automatisch“ und „Manuell“ laden die generische OR-Traktionstrennrelais-Implementierung, verwenden Sie diese Namen also nicht für Ihr eigenes Skript.


ORTSTractionCutOffRelayClosingDelay bezieht sich auf die Verzögerung zwischen dem Schließbefehl des Traktionstrennrelais und dem tatsächlichen Schließen des Relais.


9.9.5 Diesel- und Stromversorgung


Nur für Brennkraft- und Elektrolokomotiven verfügbar. Das Stromversorgungsskript ermittelt anhand der aktuellen Netzspannung, der Stromabnehmerposition, des Leistungsschalterzustands usw., ob die Lokomotive betriebsbereit ist (siehe auch Beschreibung der Motorstromversorgung und der elektrischen Stromversorgung). Es ist auch dazu in der Lage


das Verbot einiger Vorgänge im Zusammenhang mit der Stromversorgung, wenn bestimmte Bedingungen nicht erfüllt sind.


Verwenden Sie den folgenden .eng-Parameter, um ein Stromversorgungsskript zu laden:


Engine (

ORTSPowerSupply ( "YourEPS.cs" )

ORTSPowerOnDelay ( 5s )

ORTSAuxPowerOnDelay ( 10s )

)


ORTSPowerSupply bezieht sich auf das Stromversorgungsskript im Unterordner „Script“ der Engine. Für dieses Feld ist die .cs


Die Erweiterung ist optional. „Standard“ lädt die generische OP-Stromversorgungsimplementierung, also verwenden Sie diese nicht


Name für Ihr eigenes Skript.


ORTSPowerOnDelay bezieht sich auf die Verzögerung zwischen dem Schließen des Leistungsschalters oder der Traktionsunterbrechung


Relais und die Verfügbarkeit der Energie für die Traktion.


ORTSAuxPowerOnDelay bezieht sich auf die Verzögerung zwischen dem Schließen des Leistungsschalters oder der Traktionsunterbrechung


Relais und die Verfügbarkeit der Stromversorgung für Hilfssysteme.


9.9.6 Pkw-Stromversorgung


Verfügbar für Pkw mit Elektroheizung. Das Stromversorgungsskript ermittelt, ob die Systeme der Waggons mit Strom versorgt werden und berechnet den Stromverbrauch der elektrischen Zugversorgung.


Handelt es sich bei der Lokomotive um eine Diesellokomotive, steht die von den Waggons verbrauchte Leistung nicht mehr für die Traktion zur Verfügung.


Verwenden Sie den folgenden .wag-Parameter, um ein Stromversorgungsskript zu laden:


Wagon (

ORTSPowerSupply ( "YourEPS.cs" )

ORTSPowerOnDelay ( 5s )

ORTSPowerSupplyContinuousPower ( 500W )

ORTSPowerSupplyHeatingPower ( 2kW )

ORTSPowerSupplyAirConditioningPower ( 3kW )

ORTSPowerSupplyAirConditioningYield ( 0.9 )

ORTSHeatingCompartmentTemperatureSet ( 20degC )

)


ORTSPowerSupply bezieht sich auf das Stromversorgungsskript im Unterordner „Script“ des Wagens. Für dieses Feld ist die Erweiterung .cs optional. „Default“ lädt die generische OR-Stromversorgungsimplementierung, verwenden Sie diesen Namen also nicht für Ihr eigenes Skript.


ORTSPowerOnDelay bezieht sich auf die Verzögerung zwischen der Verfügbarkeit des Stroms auf dem Electric Train Supply-Kabel und der Verfügbarkeit des Stroms für die Systeme (z. B. Start des statischen Stromrichters).


ORTSPowerSupplyContinuousPower bezieht sich auf die Leistung, die kontinuierlich verbraucht wird (z. B.


Batterieladegeräte, Lichter usw.).


ORTSPowerSupplyHeatingPower bezeichnet die Leistung, die bei aktiver Heizung verbraucht wird.


ORTSPowerSupplyAirConditioningPower bezeichnet die Leistung, die bei aktiver Klimaanlage (Kühlung) verbraucht wird.


ORTSPowerSupplyAirConditioningYield bezeichnet den Ertrag der Klimaanlage (Verhältnis des Wärmestroms zur elektrischen Leistung der Klimaanlage).


ORTSHeatingCompartmentTemperatureSet bezieht sich auf die gewünschte Temperatur im Fahrzeuginnenraum.


9.9.7 Zugbeeinflussungssystem


Allgemein


Das Train Control System- oder TCS-Skript dient der Modellierung von Zugsicherheits- und Führerstandssignalsystemen. Es kann die Bedienelemente und Geschwindigkeitsbegrenzungsanzeigen der Lokomotive manipulieren, Strafbremsungen verhängen, bevorstehende Signalsignale und Geschwindigkeitsbegrenzungen lesen und Warntöne abspielen. Verwenden Sie die folgenden .eng-Parameter, um ein TCS-Skript zu laden:


Engine (

ORTSTrainControlSystem ( "YourTCS.cs" )

ORTSTrainControlSystemParameters ( "YourTCS.ini" )

ORTSTrainControlSystemSound ( "YourTCSSounds.sms" )

)


ORTSTrainControlSystem verweist auf das TCS-Skript im Script-Unterordner der Engine. Für dieses Feld ist die Erweiterung .cs optional.


ORTSTrainControlSystemParameters, ein optionales Feld, verweist auf eine .ini-Datei, ebenfalls im Script-Unterordner, deren Parameter dem TCS-Skript über die Methoden GetBoolParameter(), GetIntParameter(), GetFloatParameter() und GetStringParameter() zur Verfügung gestellt werden TrainControlSystem-Klasse. Diese .ini-Datei ermöglicht eine einfache Anpassung des Verhaltens des TCS-Skripts durch Endbenutzer.


Dies ist ein Auszug aus einer .ini-Datei:


[General]

AWSMonitor=true

EmergencyStopMonitor=false

VigilanceMonitor=true

OverspeedMonitor=false

DoesBrakeCutPower=true

BrakeCutsPowerAtBrakeCylinderPressureBar=

[AWS]

Inhibited=false

WarningTimerDelayS=3

BrakeImmediately=false

TrainStopBeforeRelease=false

ActivationOnSpeedLimitReduction=true

SpeedLimitReductionForActivationMpS=11.176

BeaconDistanceToPostM=1186

AppliesCutsPower=true


Wie zu sehen ist, ist die .ini-Datei in Untergruppen unterteilt. Beispielsweise würde der Parameter [AWS]Inhibited durch die folgende Codezeile im Skript gelesen:


AWSInhibited = GetBoolParameter("AWS", "Inhibited", false);


wobei der letzte Wert „false“ der Standardwert ist, wenn der Parameter nicht gefunden werden kann.


ORTSTrainControlSystemSound, ein optionales Feld, verweist auf eine SMS-Datei entweder im SOUND-Ordner der Engine oder im globalen SOUND-Ordner. Sofern vorhanden, lädt OR diese Soundbibliothek zusätzlich zu den Standard-Führerstandssounds der Lokomotive. Das TCS-Skript kann Sounds mit jeder der TriggerSound...-Methoden der Basisklasse wiedergeben, die wiederum die TCS-bezogenen diskreten Trigger mit den Nummern 109 bis 118 aktivieren.


Es stehen 8 weitere generische diskrete Soundauslöser mit den Namen GenericEvent1 bis GenericEvent8 zur Verfügung, auf die das Skript über Zeilen wie die folgende zugreifen kann:


SignalEvent(Event.GenericEvent1);


Zugriff auf die Simulationsmethoden und -variablen


Die abstrakte Klasse für die TCS-Skripte stellt eine erhebliche Anzahl von Methoden für den Zugriff auf Variablen bereit


Interesse für den TCS: als Beispiel:


public Func<int, Aspect> NextSignalAspect;


might be called within the script as follows:


var nextSignalAspect = NextSignalAspect(1);


was den Aspekt des zweiten normalen Signals vor dem Spielerzug zurückgeben würde.


Es ist jedoch völlig unmöglich, alle Anforderungen eines TCS-Skripts vorherzusehen und für alle diese Anforderungen eine Methode bereitzustellen. Aus diesem Grund steht folgende Methode zur Verfügung:


public Func<MSTSLocomotive> Locomotive;


Dies gibt ein Handle für die Player-Lokomotive-Instanz der MSTSLocomotive-Klasse zurück. Über ein solches Handle kann innerhalb des Skripts auf alle öffentlichen Klassen, Methoden und Variablen der OR-Simulationsumgebung zugegriffen werden.


Die Train Control System-Klasse stellt das Feld ETCSStatus bereit, das die im ETCS DMI anzuzeigenden Informationen steuert. Der folgende Block weist beispielsweise das DMI an, die kreisförmige Geschwindigkeitsanzeige in gelber Farbe anzuzeigen, wenn sich der Zug einer Geschwindigkeitsbeschränkung nähert:


ETCSStatus.CurrentMonitor = Monitor.TargetSpeed;

ETCSStatus.CurrentSupervisionStatus = SupervisionStatus.Indication;

ETCSStatus.TargetDistanceM = 1234.5f;

ETCSStatus.AllowedSpeedMpS = 50;

ETCSStatus.InterventionSpeedMpS = 52.5f;

ETCSStatus.TargetSpeedMpS = 25;


Notbremsung durch den Simulator ausgelöst


Die vom Simulator ausgelösten Notbremsungen werden immer an das TCS-Skript gesendet.


Zur Übermittlung dieser Informationen werden zwei Funktionen genutzt:


öffentliche Überschreibung void HandleEvent(TCSEvent evt, string message)


Die gesendeten Ereignisse sind EmergencyBrakingRequestedBySimulator, EmergencyBrakingReleasedBySimulator und ManualResetOutOfControlMode. Beim ersten Ereignis wird zusätzlich der Grund der Notbremsung übermittelt:


• SPAD: Der Zug hat ein gefährdetes Signal an der Vorderseite des Zuges passiert


• SPAD_REAR: Der Zug hat ein gefährdetes Signal am Ende des Zuges passiert


• MISALIGNED_SWITCH: Der Zug ist einer falsch ausgerichteten Weiche hinterhergefahren


• OUT_OF_AUTHORITY: Der Zug hat die Autoritätsgrenze überschritten


• OUT_OF_PATH: Der Zug ist von seinem zugewiesenen Weg abgekommen


• SLIPPED_INTO_PATH: Der Zug ist wieder in die Gleise eines anderen Zuges gerutscht


• SLIPPED_TO_ENDOFTRACK: Der Zug ist vom Gleisende abgerutscht


• OUT_OF_TRACK: Der Zug ist vom Gleis abgekommen


Steuerungssysteme verfügen über ein recht hochentwickeltes DMI (Fahrer-Maschine-Schnittstelle), das ein (Touchscreen-)Display und Tasten umfassen kann. Als Anzeigefelder und Symbole sowie die für jedes TCS spezifischen Schaltflächen stehen eine Reihe generischer Cabview-Steuerelemente zur Verfügung, die innerhalb des TCS-Skripts angepasst werden können. Es sind generische Cabview-Steuerelemente mit den Namen ORTS_TCS1, ORTS_TCS2 usw. verfügbar. Alle von ihnen können als Zwei-Zustands- oder Mehrzustandssteuerungen verwendet werden, wie z. B.:


MultiStateDisplay (

Type ( ORTS_TCS13 MULTI_STATE_DISPLAY )

Position ( 405 282.3 36.3 20.8 )

Graphic ( ../../Common.Cab/Cruscotto_SCMT/Ripetizioni_estese.ace )

States ( 6 3 2

State (

Style ( 0 )

SwitchVal ( 0 )

)

State (

Style ( 0 )

SwitchVal ( 1 )

)

State (

Style ( 0 )

SwitchVal ( 2 )

)

State (

Style ( 0 )

SwitchVal ( 3 )

)

State (

Style ( 0 )

SwitchVal ( 4 )

)

State (

Style ( 0 )

SwitchVal ( 5 )

)

)

)


Sie können auch als Befehle/Anzeigen mit zwei Zuständen verwendet werden, wie z. B.:


TwoState (

Type ( ORTS_TCS7 TWO_STATE )

Position ( 377 298 9 7.8 )

Graphic ( ../../Common.Cab/Cruscotto_SCMT/Button_SR.ace )

NumFrames ( 2 2 1 )

Style ( PRESSED )

MouseControl ( 1 )

)


Die Befehle werden vom Skript asynchron über diese Methode empfangen:


öffentliche Überschreibung void HandleEvent(TCSEvent evt, string message)


Dabei kann evt TCSEvent.GenericTCSButtonPressed oder TCSEvent.GenericTCSButtonReleased sein und message ist eine Zeichenfolge, die die Kontrollnummer mit Nullbasisindizierung darstellt (z. B. „5“ entspricht ORTS_TCS6). Die Befehle können nur mit der Maus ausgelöst werden, mit Ausnahme der ersten beiden, die auch durch die Tastenkombinationen Strg, (Komma) und Strg ausgelöst werden können. (Zeitraum). Hier ist ein Codeauszug aus dem Skript, das die Befehle verwaltet:


öffentliche Überschreibung void HandleEvent(TCSEvent evt, string message)


{

if (message == String.Empty)

{

switch (evt)

{

case ...

...

break;

case ...

...

break;

}

}

else

{

var commandEvent = TCSCommandEvent.None;

var messageIndex = 0;

if (Int32.TryParse(message, out messageIndex))

{

commandEvent = (TCSCommandEvent)(messageIndex + 1);

switch (evt)

{

case TCSEvent.GenericTCSButtonPressed:

TCSButtonPressed[(int)commandEvent] = true;

break;

case TCSEvent.GenericTCSButtonReleased:

TCSButtonPressed[(int)commandEvent] = false;

TCSButtonReleased[(int)commandEvent] = true;

break;

}

}

}

}


Innerhalb der Update-Methode des Skripts können TCSButtonPressed und TCSButtonReleased getestet werden, z.B.:


if (TCSButtonPressed[(int)(TCSCommandEvent.Button_Ric)])


Nach dem Test sollte TCSButtonPressed vom Skriptcode auf false gesetzt werden.


Sie können TCSEvent.GenericTCSSwitchOff und TCSEvent.GenericTCSSwitchOn auch für ein Cabview-Steuerelement verwenden, das einen Schalter darstellt (Stil ONOFF statt PRESSED in der CVF-Datei).


Um eine Anzeige eines Cabview-Steuerelements anzufordern, gehen Sie wie folgt vor:


public Action<int, float> SetCabDisplayControl;


muss verwendet werden, wobei int der Index der Cab-Steuerung ist (beginnend bei 0, was ORTS_TCS1 entspricht) und float der Wert ist, der zur Auswahl zwischen Frames verwendet werden soll.


Wenn der Spieler die Maus über die mit Befehlen verknüpften Cabview-Steuerelemente bewegt, erscheint kurz der Name dieses Steuerelements auf dem Display, z. B. „Tachometer“, als Erinnerung für den Spieler. Bei diesen generischen Befehlen würden Zeichenfolgen wie „ORTS_TCS1“ oder „ORTS_TCS32“ erscheinen, die überhaupt nicht mnemonisch sind. Daher steht folgende Methode zur Verfügung:


public Action<int, string> SetCustomizedCabviewControlName;


was innerhalb des Skripts folgendermaßen verwendet werden kann:


// Initialize customized TCS cabview control names

SetCustomizedCabviewControlName(0, "AWS acknowledge"); // Sets the name "AWS acknowledge"␣

˓→for the cabview control ORTS_TCS1


sodass anstelle von ORTS_TCSnn die zugehörige mnemonische Zeichenfolge angezeigt wird.


9.9.8 Hilfsklassen


Im Orts.Scripting.Api-Namespace sind drei Hilfsklassen verfügbar:


• Eine Timer-Klasse


• Eine Kilometerzähler-Klasse


• Eine Blinker-Klasse


Timer


Der Timer kann verwendet werden, um Code nach Ablauf einer bestimmten Zeit auszuführen. Um den Timer nutzen zu können, müssen Sie in Ihrer Skriptklasse eine Eigenschaft erstellen, um das Objekt zu speichern.


öffentlicher Timer MyTimer;


Im Konstruktor Ihrer Skriptklasse müssen Sie das Objekt instanziieren und die Verzögerung des Timers festlegen.


MyTimer = neuer Timer(this);


MyTimer.Setup(5f); // Setzt die Verzögerung des Timers auf 5 Sekunden


Wenn Sie dann den Timer starten möchten, verwenden Sie die Startfunktion.


MyTimer.Start();


Wenn Sie den Timer zurücksetzen möchten, verwenden Sie die Stop-Funktion.


MyTimer.Stop();


Wenn die Verzögerung erreicht ist, wird die Triggered-Eigenschaft des Timers wahr.


if (MyTimer.Triggered)


{

// Etwas tun

}


Bitte beachten Sie, dass die Triggered-Eigenschaft false ist, wenn der Timer gestoppt wird.


Kilometerzähler


Der Kilometerzähler kann verwendet werden, um einen Code auszuführen, nachdem der Zug eine Strecke zurückgelegt hat. Um den Kilometerzähler nutzen zu können, müssen Sie in Ihrer Skriptklasse eine Eigenschaft erstellen, um das Objekt zu speichern.


öffentlicher Kilometerzähler MyOdometer;


Im Konstruktor Ihrer Skriptklasse müssen Sie das Objekt instanziieren und die Entfernung festlegen, bei der der Kilometerzähler ausgelöst wird.


MyOdometer = neuer Kilometerzähler (dies);


MyOdometer.Setup(200f); // Setzt den Auslösewert des Kilometerzählers auf 200 Meter


Wenn Sie dann den Kilometerzähler starten möchten, verwenden Sie die Startfunktion.


MyOdometer.Start();


Wenn Sie den Kilometerzähler zurücksetzen möchten, verwenden Sie die Stoppfunktion.


MyOdometer.Stop();


Wenn die Distanz erreicht ist, wird die Triggered-Eigenschaft des Kilometerzählers wahr.


if (MyOdometer.Triggered)


{

// Etwas tun

}


Bitte beachten Sie, dass die Triggered-Eigenschaft falsch ist, wenn der Kilometerzähler gestoppt wird.


Blinker


Der Blinker kann verwendet werden, um eine Cabview-Steuerung zum Blinken zu bringen. Um den Blinker nutzen zu können, müssen Sie in Ihrer Skriptklasse eine Eigenschaft erstellen, um das Objekt zu speichern.


öffentlicher Blinker MyBlinker;


Im Konstruktor Ihrer Skriptklasse müssen Sie das Objekt instanziieren und die Häufigkeit festlegen, mit der es ausgeführt werden soll


Die Cabview-Steuerung blinkt.


MyBlinker = neuer Blinker(this);


MyBlinker.Setup(6f); // Setzt die Blinkfrequenz auf 6 Hz


Wenn Sie dann den Blinker starten möchten, verwenden Sie die Startfunktion.


MyBlinker.Start();


Wenn Sie den Blinker zurücksetzen möchten, nutzen Sie die Stop-Funktion.


MyBlinker.Stop();


Die Eigenschaft „Blinker Ein“ wechselt mit der eingestellten Häufigkeit zwischen „wahr“ und „falsch“.


SetCabDisplayControl(0, MyBlinker.On ? 1 : 0);


Bitte beachten Sie, dass die On-Eigenschaft false ist, wenn der Blinker gestoppt ist.

Share by: