TMX
Das TMX Format ist das Standardformat des Mapeditors Tiled, welcher für Invertika benutzt wird. Eine TMX Datei könnte z.B. so aussehen:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd"> <map version="1.0" orientation="orthogonal" width="30" height="30" tilewidth="32" tileheight="32"> <tileset name="Collision" firstgid="1" tilewidth="32" tileheight="32"> <image source="../graphics/tiles/collision.png"/> </tileset> <tileset name="desert1" firstgid="3" tilewidth="32" tileheight="32"> <image source="../graphics/tiles/desert1.png"/> </tileset> <tileset name="desert2" firstgid="259" tilewidth="32" tileheight="32"> <image source="../graphics/tiles/desert2.png"/> </tileset> <tileset name="desert_x2" firstgid="515" tilewidth="32" tileheight="64"> <image source="../graphics/tiles/desert_x2.png"/> </tileset> <tileset name="desert_x3" firstgid="531" tilewidth="32" tileheight="96"> <image source="../graphics/tiles/desert_x3.png"/> </tileset> <tileset name="desert_x5" firstgid="547" tilewidth="32" tileheight="160"> <image source="../graphics/tiles/desert_x5.png"/> </tileset> <tileset name="desert3" firstgid="553" tilewidth="32" tileheight="32"> <image source="../graphics/tiles/ivk_desert1.png"/> </tileset> <layer name="Ground" width="30" height="30"> <data encoding="base64" compression="gzip"> H4sIAAAAAAAAAO3NMQ0AIAwAsIGh6SBzjDo4Z4Dw9OjdmhF7vLfuk015vV6v1+v1er1er/frewAf+gneEA4AAA== </data> </layer> <layer name="Fringe" width="30" height="30"> <data encoding="base64" compression="gzip"> H4sIAAAAAAAAAGNgYGA4BcQBNMS7GLCDbBzi1AK4zB9s9pIa/qSGJ7XCgRzzJZkYGKSBWAaIZYFYjgmhXhnIVgFiVSbC9uIzh1L1I8FeNSBfHYg1oGGNLeyHk39Hor3IcToav7S1Fz0/DVf/YktH6GLDyb8DZS8xdeFw8i86GC2v6FMvjAT/DhZ76VFOUrvcAACgk4WWEA4AAA== </data> </layer> <layer name="Over" width="30" height="30"> <data encoding="base64" compression="gzip"> H4sIAAAAAAAAAO3BAQEAAACCIP+vbkhAAQAA8Gh7blyXEA4AAA== </data> </layer> <layer name="Collision" width="30" height="30"> <data encoding="base64" compression="gzip"> H4sIAAAAAAAAAO3RQQoAIAgEwKX/P7oPGF0sCmbBiyAjmiTjQlVZ9bvyi3v6ntVM1y93+3C5XC6Xy+Vyudx33QkSDN5uEA4AAA== </data> </layer> </map>
Als erstes kommt der map Tag in dem alle anderen tags untergeordnet sind. Der erste Tag von Interesse ist dann der tileset Tag. In diesem Tag stehen der Name des Tilesets, die FirstGID (dazu später mehr), die Breite und Höhe der Tiles sowie das Quellbild des Tilesets.
Nachdem die Tilesets definiert sind beginnen auch schon die Layer Definitionen. Eine Karte kann aus mehreren Layern bestehen z.B. einem Kollisionlayer. Im Layer Tag stehen der Name, die Breite und Höhe des Layers. Darunter folgt bei komprimierten Karten (die Standardeinstellung von Tiled) der Tag data mit dem Attribut encoding. In unserem Beispiel ist die Kodierung Base64 und die Kompression gzip. Um an die Daten des Layers zu kommen muss man den von den Data Tags eingeschlossen String nehmen und mittels Base64 decodieren. Anschließend erhält man ein Byte Array. Dieses Byte Array muss dann noch mittels des gzip Algorithmus dekomprimiert werden. Bei dieser Aktion kommt am Ende auch wieder ein Byte Array heraus.
In diesem Byte Array stehen dann die Tilenummern drin und zwar in Form von 4 Byte Integers (Little Endian). Hat man z.B. eine 2x2 Karte so würden die Tiles in folgender Reihenfolge kommen: 0,0 - 0,1 - 1,0 - 1,1.
Nun stellt sich nur noch die Frage wie man diese Tilenummern interpretiert. Und dabei kommt jetzt die FirstGID des Tileset zum tragen. Nehmen wir an das wir die Tilenummer 270 auslesen. Um nun zu ermitteln zu welchem Tileset die Nummer gehört prüfen wir in welches Tileset in diesem Bereich liegt und stellen fest das das Tileset desert2 genau in diesem Bereich liegt. Dann rechnet man noch Tilesetnummer - FirstGID und schon hat man die Tilesetnummer und das Tileset (in diesem Fall 11). Nun wissen wir das das Tile das elfte Tile im Tileset desert2 ist.