Automatisierte Methode zum Extrahieren von Sprites mit unregelmäßiger Größe aus einem Sprite-Sheet

Ich habe ein Sprite-Sheet aus einem klassischen Videospiel (wenn Sie neugierig sind, Final Fight), das ich gerne in einzelne Bilder aufteilen möchte, um es in GameSalad zu verwenden . Die Bilder befinden sich jedoch nicht in einem gleichmäßigen Raster, und alle haben einen unterschiedlichen Abstand zwischen ihnen.

Gibt es eine automatisierte Möglichkeit, Bilder basierend auf zusammenhängenden Pixeln oder ähnlichem zu exportieren?

Geben Sie hier die Bildbeschreibung ein

Antworten (2)

Spritesheets sollten für jeden Frame die gleiche Größe haben, damit Sie dieses Problem nicht bekommen. Dafür ist ein Sprite-Atlas da. Wenn Sie einen Sprite-Atlas mit Bildern wie diesen erstellen, erstellt das von Ihnen verwendete Programm Offsets für jeden Frame, sodass er in anderen Programmen wie Wildsalat einfach zu verwenden ist und weniger Platz beansprucht.

Das Problem hierbei ist, dass Sie einen bereits erstellten Sprite-Atlas verwenden und die Offset-Informationen nicht erhalten haben. Der beste Weg, den ich mir vorstellen kann, ist, Photoshop oder ähnliches zu verwenden und jeden Rahmen mit der gewünschten Größe zu trennen und dann einen Atlas-Generator zu verwenden, um den Atlas für Sie zu erstellen ( http://www.codeandweb.com/texturepacker Ich mag diesen, kann auch manuell erledigt werden, nur mehr Arbeit).

Sie können dies mit ImageMagick und diesem Hilfsskript tun . Das Skript teilt das Bild nur vertikal, aber das ist in Ordnung – wir können die resultierenden Streifen um 90 Grad drehen und es erneut versuchen.

(Dies alles setzt voraus, dass Sie unter Linux, Mac OS X oder einem anderen Unix-Betriebssystem arbeiten, da das Skript ein Unix- Bash - Shell-Skript ist. Wenn Sie unter Windows arbeiten, könnten Sie versuchen, es unter Cygwin auszuführen . Und natürlich müssen Sie natürlich ImageMagick installiert haben, obwohl Sie es wahrscheinlich bereits tun, wenn Sie Linux verwenden.)

Insbesondere wenn Sie das Bild in Ihrer Frage als spritesheet.pngund das Skript als divide_vertim aktuellen Verzeichnis gespeichert und das Skript mit ausführbar gemacht chmod 755 divide_verthaben, sollten die folgenden Shell-Befehle die Aufgabe erledigen:

./divide_vert -i spritesheet.png line-%02d.png
montage line-*.png -rotate 90 -geometry '1x1<' -tile 1x -background none joined.png
./divide_vert -i joined.png sprite-%03d.png
mogrify -rotate 270 sprite-*.png

Der montageBefehl ist ein bisschen knifflig, da er zwei Dinge gleichzeitig macht: die Linien um 90 Grad im Uhrzeigersinn drehen und sie zu einem einzigen hohen Streifen verbinden, sodass wir sie alle mit nur einem weiteren Aufruf des Skripts aufteilen können. Die komisch aussehenden -geometryund -tile-Optionen montageweisen darauf hin, dass die Quellbilder nicht wie normalerweise in der Größe geändert werden sollen und sie in einer einzigen vertikalen Spalte angeordnet werden sollen. Weitere Informationen zu ihrer Funktionsweise finden Sie auf dieser Seite .

Der zweite divide_vertDurchgang wird wahrscheinlich etwas länger dauern als der erste. Geben Sie ihm einfach eine halbe Minute oder so und es sollte erledigt sein. Alle anderen Schritte sollten ziemlich schnell gehen.


PS. Der Befehl von ImageMagick montageist auch praktisch zum Erstellen von Sprite-Sheets, wie in dieser Antwort auf dem Game Development Stack Exchange .

Pps. Ich bin mir sicher, dass es andere ImageMagick-Skripte gibt, die diese Aufgabe erledigen können, dies war nur das erste, das ich gefunden habe. Eine andere, die mehr Funktionen hat und die gesamte Arbeit in einem Durchgang erledigen kann, heißt "Multicrop" . Leider ist das Multicrop-Skript für diese Aufgabe vielleicht etwas zu fortgeschritten: Sie müssen die Unrotation-Funktion deaktivieren und den Rasterabstand auf 1 reduzieren, um die erwarteten Ergebnisse zu erzielen, und selbst dann ist es ein bisschen zu eifrig beim Aufteilen der Sprites , so dass zB die wenigen getrennten Pixel unterhalb des springenden Sprites in ein separates Bild aufgeteilt werden. Es ist auch ziemlich langsam, wenn Sie viele Sprites auf dem Blatt haben.