Einleitung LocoXML Sprites Farben Bauwerke Bahnkram Fahrzeuge Krimskrams  

Die Grafik von Locomotion

Die Grafik von Locomotion

Die meisten Locomotion Objekte enthalten Spritegrafiken, die am Ende der LocoXML in der Spritetable notiert sind. Die einzelne Sprites werden dabei von 0 an beginnend durchnummeriert. (Attribut id)
<sprite id="0" xofs="-64" yofs="-33">
	...
<sprite id="1" xofs="-64" yofs="-33">
	...
<sprite id="2" xofs="-64" yofs="-33">
	...
	 .
	 .
	 .
<sprite id="18" xofs="-54" yofs="-33">
	...
<sprite id="19" xofs="-54" yofs="-33">
	...
Wie schon erwähnt, erhalten wir beim Dekodieren eines Objekts mit LocoTool entweder eine ganz große oder viele kleine Grafikdateien. Wenn LocoTool mit dem Parameter -s gestartet wird, packt es alle Sprites in eine PNG-Datei. Der Name der Datei ergibt sich dabei aus der ObjID der Objektes und der Endung .png. So wie hier.
Wird LocoTool ohne Parameter gestartet, erzeugt es ein neues Verzeichnis, benennt es nach der ObjID und packt dort jedes Sprite in eine eigene Datei hinein. Der Name wird hierbei aus der Spritenummer (dreistellig mit führenden Nullen) und wieder der Endung .png gebildet.
Der Eintrag eines einzelnen Sprites in der Spritetable sieht im Detail so aus. Zum besseren Verständnis arbeiten wir uns hier vielleicht mal von innen nach außen vor.
<sprite id="0" xofs="-64" yofs="-32">
	<bit name="hasdata">1</bit>
	<bit name="chunked">0</bit>
	<bit name="copy">0</bit>
	<!-- Spritedatei -->
	  ...
</sprite>
Die Angaben zur Spritedatei hab ich ausgelagert, weil es hier 3 Fälle zu unterscheiden gilt.
<!-- Spritedatei -->

<!-- Fall 1: Locotool ohne Parameter -->
<pngfile>
	G:\\... ...\\LocoWork\\Gebäude\\BLDALP1\\000.png
</pngfile>

<!-- Fall 2: Locotool mit Parameter -s -->
<pngimage xofs="4" yofs="8" width="128" height="64">
	G:\\... ...\\LocoWork\\Gebäude\\BLDALP1.png
</pngimage>

<!-- Fall 3: Leerer Sprite -->
<stub>0</stub>

<!-- In allen drei Fällen gehört alles in eine Zeile!! -->
Wie ihr seht, steht hier der vollständige Pfad zur betreffenden Grafikdatei drin, wobei im Unterschied zur normalen Windows-Notation die Verzeichnistrenner verdoppelt sind.
Fall 1:
Dies ist der unkomplizierteste. Der Sprite wird direkt geladen. Breite und Höhe sind damit bekannt.

Fall 2:
Hier wird's schon etwas spannender. Der Sprite wird aus einer großen Grafik herausgepickt. Dazu benötigt man einen Startpunkt [xofs, yofs] und für das auszuschneidende Rechteck die Breite width und die Höhe height.
Fall 3:
Dies ist scheinbar verwunderlich. Aber es kann vorkommen, daß ein Objekt einen Sprite nicht benötigt, dieser aber mit einem leeren Platzhalter in der Struktur verbleiben muss.

Nun haben wir schon mal eine definierte Spritegrafik und halten sie an der linken, oberen Ecke fest. Kümmern wir uns doch gleich um die drei Bits, die da noch im Inneren des Spriteeintrags herumlungern:
hasdata:
Tja, laut englischem Wiki ist es gesetzt, wenn das Sprite eine Grafik hat. Ich hab aber noch keinen Fall gesehen, wo dieses Bit nicht gesetzt ist. Selbst im oben erwähnten Fall 3 nicht. Ich werde Laut geben wenn ich mehr darüber herausfinde.
chunked:
Originaltext der englischen Wiki: 'If it is chunked'. Sehr aussagekräftig. Ich habe aber mittlerweile herausgefunden, daß wenn es nicht gesetzt ist (0), die transparente Hintergrundfarbe pink ist, und wenn es gesetzt ist (1) die transparente Hintergrundfarbe blau ist.
copy:
Es kann vorkommen, daß in einem Objekt das gleiche Sprite mehrmals hintereinander Verwendung findet. Da Grafikdaten aber bekanntlich auch gute Resourcenfresser sind, wäre es Blödsinn, diese mehrfach zu speichern. Daher werden, wenn dieses Bit gesetzt ist, die Daten des vorherigen Sprites übernommen. Der zugehörige Spriteeintrag sieht dann auch gleich etwas anders aus.
<sprite id="33" xofs="0" yofs="0">
	<bit name="hasdata">1</bit>
	<bit name="chunked">0</bit>
	<bit name="copy">1</bit>
</sprite>
Unschwer zu erkennen ist hier der nicht vorhandene Verweis auf die Grafikdatei. Und auch das, was wir gleich noch behandeln werden, weicht hier etwas ab.

Wir tauchen wieder an die Oberfläche eines Spriteeintrags ...
<sprite id="0" xofs="-64" yofs="-32">
... und sichten seine Headerzeile.
Hmm. id? Geht klar! xofs, yofs? Hatten wir das eben nicht schon mal?

Jahaa, aber in einem ganz anderen, speziellen Zusammenhang, in dem es darum ging ein Sprite zu lokalisieren. Hier geht es ein Sprite zu positionieren. Was heißt das?
Alle Sprites haben einen Bezugspunkt, der ihrem konstruktiven Mittelpunkt entspricht, und das ist so gut wie nie die linke, obere Ecke, die ihr festhalten solltet. Ihr erinnert Euch?
Jeder der schon einmal mit Konstruktionslehre zu tun hatte, kennt sicherlich diesen Satz: 'Am Anfang schuf Gott die Mittellinie.' Und von dieser bzw. ihrem Ursprung ausgehend, wird alles weitere drum herum gebaut. Will man nun Objekte aus mehreren Sprites zusammensetzen, muss man ihre Mittellinien zur Deckung bringen. Dazu dienen hier die Offsets. Euch ist sicher aufgefallen, daß hier die Offsetwerte negativ sind. Bildkoordinaten werden von links nach rechts und von oben nach unten gezählt. Wenn man nun eine relative Verschiebung nach links oben vornimmt ergeben sich daraus negative Werte. Die kleine Animation hier soll das Ganze noch einmal veranschaulichen. Nebenbei wird hier noch einmal das Prinzip der transparenten Farben angedeutet.

Alles verstanden bis jetzt? Keine Bange! Es wird eh noch komplizierter.