Das Rad neu erfinden

2018-04-11

Für die häufigstens Probleme gibt es akzeptierte Lösungen oder fertige Tools. Dazu gehört das Packen von Sprites oder Texturen in eine große Textur oder Sprite-Sheet. Kein Grund also wieder einmal das Rad neu zu erfinden. Ausser man hält es wie Richard Feynman:

What I cannot create, I do not understand.

In meinem Fall hatte ich etwas überspezifische Anforderungen, die keines der verfügbaren Tools für mich bot. Die Informationen der Subtexturen sollten im JSON-Format vorliegen und die Möglichkeit diese über numerische IDs zu finden. FSM sei Dank, hat Nicolas Perdu genug Vorarbeit geleistet um meine Wunsch-Features einfach selber zu implementieren ohne alles drum herum neu zu machen. (Mal wieder ein Paradadebeispiel für die Vorteile von FOSS).

Schwuppdiwupp, und der Sprite Sheet Packer ist fertig! Das JSON-Format ist sehr einfach und sieht so aus:

{"TextureAtlas":
{
    "imagePath": "example",
    "SubTexture":
    [
        { "name": "img17", "x": 235, "y": 149,
            "width": 58, "height": 59,
            "rotation": 0, "id": 2822025959 },
        { "name": "img18", "x": 470, "y": 0,
            "width": 29, "height": 76,
            "rotation": 0, "id": 948678518 }
    ]
}}

Die numerischen IDs sind einfache CRC32-Summen der Dateinamen. Das ist einfach genug, ich erwarte da sobald keine Kollisionen. Man kann sich auch gleich eine C++-Header mit allen IDs generieren lassen. Einfacher geht es wirklich nicht. Durch die großartige Vorarbeit von Jukka Jylänk ist auch auf der algorithmischen Seite alles erschlagen. Das Packergebnis sieht gut aus und ich muss kein weiteres Gehirnschmalz in dieses Problem investieren.

Example sprite sheet packing

Tags: GameDev, C++