1. Teil – Erste Schritte

From now, the TrainzDepot is in a read-only mode, see our announcement). From now, our new place-to-go, https://www.trainz.de is available.
Since 28.02.2019 personal data (e.g. profile contents, private messagers) has been deleted.

Ich werde euch nun etwas über das Scripting in Trainz erklären. Man hört zwar immer, dass es besser sei, man bringe Vorkenntnisse aus der ?richtigen? Welt der Programmierung mit, aber unbedingt brauchen tut man sie auch nicht. Zu aller erst werde ich erklären, womit man am meistens arbeitet und was man damit schon alles machen kann. Eine Wichtige Seite, die man sich unbedingt abspeichern sollte, ist das TrainzDEV-Wiki (http://online.ts2009.com/mediaWiki/index.php/Scripting). Dort stehen alle Funktionen, die Trainz mitbringt. Was das genau heißt, erkläre ich später.


Wie ist ein Script aufgebaut?
Ein Trainz-Script ist eine Datei mit der Endung ?.gs? (es gibt auch GSE, aber ich finde die Verschlüsselung von Scripten nicht gut, weshalb ich dazu hier auch nichts erklären werde).
Man kann diese Datei mit einem ganz normalen Editor erstellen (es geht sogar der in Windows eingebaute Editor). Ich verwende immer Notepad++ mit Syntaxhighlightning, was aber auch nicht zwingend erforderlich ist. Im Folgenden werde ich das Minimum eines Scriptes zeigen, also die Dinge, die in jedem Script vorhanden sein müssen.

Gehen wir die Zeilen mal Schritt für Schritt durch:


Zeile 001:
?Include? ist Englisch und bedeutet ?einbinden?. Wir binden quasi ein fertiges Script ein. Dieses ist in Trainz bereits vorhanden. In diesem Script sind alle fertigen Funktionen für die Klasse ?MapObject?, das der Content-Kind (?kind? aus der ?config.txt?) ?scenery? entspricht. Das heißt, wir binden die fertigen Funktionen aus Trainz für Scenery-Objekte ein. Dazu gehören u.a. Gebäude. Wollte man ein Script für ein Gleisrandobjekt erstellen, muss man die Datei ?Trackside.gs? auf die gleiche Weise einbinden.


Zeile 003:
Hier wird es ein wenig mehr. Das erste Wort ?class? beginnt eine neue sog. Klasse. Was das genau ist, wäre an dieser Stelle zu viel, aber, dieses Wörtchen bedeutet, dass wir für unser Objekt eine neue Klasse erstellen (?MapObject? ist auch eine Klasse). Das Wort hinter der Klasse ist der Name, den wir für unsere Klasse wählen (hier: ?meinobjekt?). Damit sagen wir Trainz: Neue Klasse mit dem Namen ?meinobjekt?. In diese Klasse fügen wir unser eigentliches Script ein und fügen unserem Objekt somit Funktionen hinzu, die Trainz noch nicht selbst mitbringt. Danach kommt ?isclass MapObject?. Das bedeutet einfach nur, dass unsere Klasse ?meinobjekt? eine Tochter-Klasse der Klasse ?MapObject? ist. Das müssen wir immer tun (zur Erinnerung: bei Gleisrandobjekten muss statt MapObject die Klasse ?Trackside? verwendet werden). Kurz: Wir erklären Trainz, dass unsere Klasse ?meinobjekt? ein Scenery-Objekt ist und auch als solches Behandelt werden soll. Damit wird Trainz unser Objekt, auch wenn wir es selbst mit einer eigenen Klasse versehen, immer noch als ein Scenery-Objekt klassifizieren.


Zeile 004:
Geöffnete geschweifte Klammern werden immer gesetzt, wenn man einen neuen ?Block? einleitet. Unser ?class?-Befehl eröffnet einen neuen Block und zwar den Block einer Klasse.


Zeile 005:
Das ist die erste Funktion, die Trainz mitbringt. Dies ist die sog. Einsprungfunktion, was bedeutet, dass Trainz beim Initialisieren (darum heißt das gute Stück auch ?Init?) des Objektes an dieser Stelle im Script einspringt. Es setzt sozusagen den Startpunkt unseres Scriptes. In die beiden runden Klammern kommen immer die Parameter der Funktionen. Parameter sind Werte, die eines bestimmten Typs angehören können. Hier wird der Funktion ?Init? einen Parameter mit dem Typ ?Asset? übergeben. Asset ist eine Klasse in Trainz, in die alle in Trainz installierten Objekte gehören. Es sind dort sozusagen nackte Objekte, da es in der Klasse ?Asset? egal ist, welche Art von Objekt es ist. Warum aber steht dort einmal ?Asset? und einmal ?asset?? Das ist einfach: Man gibt zuerst den Typ oder die Klasse des Parameters an und dann den Namen des Parameters. Das heißt unser Objekt, als ?Asset? betrachtet, wird in dem Parameter ?asset? gespeichert.


Zeile 006:
Hier öffnet sich wieder ein Block und zwar eine Funktion, auch Methode genannt (hier: ?Init?). Nach dieser Klammer kommt all das, was wir später in der ?Init?-Methode benötigen.


Zeile 007:
Das ist die wichtigste Zeile im ganzen Script. Diese Zeile darf niemals fehlen. Die sorgt nämlich dafür, dass Trainz auch wirklich unser Objekt korreckt verarbeitet. Wir geben dort einen Parameter an Trainz und zwar den Parameter unserer ?Init?-Funktion, nämlich ?asset?. Damit sagen wir Trainz, dass es unser Objekt als ?Asset? betrachtet, das in ?asset? gespeichert ist, auch wirklich verarbeitet. Wichtig ist hier noch:
Funktionen und Methoden, die keinen Block eröffnen müssen immer mit einem Simikolon ?;? abgeschlossen werden. Anders würde Trainz das Ende der Zeile und das Ende der Funktion oder Methode nicht erkennen und es käme zu einen Scriptfehler (einem ?bug?, was zu Deutsch ?Käfer? heißt und ab TS12 erscheint auch ein Käfer am unteren rechten Bildschirmrand, in anderen Versionen ein roter Punkt). Dies ist ein besonderer Anfängerfehler, den man sich erst abgewöhnen muss.


Zeile 008:
Der Block, den die Funktion ?Init? geöffnet hat wird mit einer geschlossenen geschweiften Klammer geschlossen.


Zeile 009:
Diese geschlossene geschweifte Klammer schließt den Block der Klasse ?meinobjekt?. Wenn man den Block einer Klasse schließt, muss immer nach der geschweiften Klammer ein Simikolon folgen. Auch dort darf er nicht vergessen werden, tut man es trotzdem wirft Trainz einem direkt einen Script-Fehler vor den Kopf.