In letzter Zeit habe ich viel Zeit mit Pixelart verbracht und auch einiges programmiert. Dabei habe ich PICO-8's Fantasy Konsole richtig in's Herz geschlossen! Diese kleine, gemütliche Entwicklungsumgebung ist genau das Richtige, um kleine Simulationen, Prototypes und Mockups zu erstellen! Wie ihr wisst, hege ich seit langem den Wunsch, ein eigenes Spiel zu veröffentlichen, hab's aber nie geschafft eine Idee komplett umzusetzen. Es mangelt mir wohl an Durchhaltevermögen und Überzeugung. Eine neue Idee löst eine andere ab, und so füllt sich meine Festplatte mit immer mehr unfertigen Prototypes - alles nette Spielereien, aber eben nichts Halbes und nichts Ganzes. Trotzdem macht es Spaß zu experimentieren und ich lerne jeden Tag eine Menge neues!

Obwohl ich euch bisher noch nichts konkretes zeigen konnte, habe ich den Grundstein für mein Traumspiel bereits gelegt. Irgendwo, in einem Stapel von Skizzen und Gamedesign-Dokumenten, liegt mein zehn-seitiges Exposé mit einer fabelhaften Story für ein 2D-Adventure-Rollenspiel im 8-Bit-Pixel-Style. Es existiert also eine relativ genaue Vorstellung darüber, wie das Spiel aussehen und das Gameplay werden soll. Um die Idee visuell zu erkunden und ein bisschen an meiner Motivationsschraube zu drehen, habe ich, von Zeit zu Zeit, einige Charaktere gestaltet. Wie sich herausstellte, waren diese zunächst nur wenig überzeugend. Und so näherte ich mich Stück für Stück dem Stil an, den ich eigentlich anstreben wollte: 8 Bit (8x8 Pixel Tiles).

Natürlich war es mir klar, dass ich meine umfangreiche Story auf keinen Fall allein mit PICO-8 umsetzen kann, da die Fantasy Konsole sehr strenge Einschränkungen hat. Doch um Sachen auszuprobieren, ist PICO nur zu willkommen! Und als ich meinen Stil endlich fand, war auch klar, dass ich auf diese IDE nicht ganz verzichten kann.

Ich beschloss alle Sprites in PICO zu erstellen und auch gleich dort das Gameplay auszuprobieren. Die (Re-)Implementierung erfolgt dann in Codea oder wahlweise in LÖVE2D. Da ich viel Unterwegs bin und Geistesblitze meist sofort ausprobieren möchte, bevor ich sie vergesse, habe ich mich zuerst Codea zugewandt - zumal ich mit LOVE schon einige Zeit nichts mehr zu tun hatte und die API nicht mehr so gut im Kopf habe. Das resultiert meist nur im endlosen Google. Mit "schnell mal ausprobieren" ist da nichts! Codea erwies sich als sehr bequem und zuverlässig, wie gewohnt(!), jedoch fehlten mir ständig Funktionen - eben solche grundlegenden Sachen, wie Kameraführung, GameObject-Klassen, Multitouch-Handler und gute Tools für's Debugging. Also begann ich all diese kleinen Helfer zu programmieren und mir die Basis für ein eigenes Game-Framework zu schaffen (denn Codea hat keine Angebote, was das angeht). Mit jeder Sitzung kam eine neue, nützliche Funktion hinzu und schon bald konnte ich 3D-Meshes, Sprite-Animationen, 3D-Kameras und anderen Spaß mit einander kombinieren. Leider konnte ich die meisten Sachen gar nicht richtig auf Fehler testen, denn dazu benötigt man richtiges Gameplay, um diese Werkzeuge, in einem reellen Einsatzszenario, auf Herz und Niere zu prüfen.

Bis zu diesen Zeitpunkt hatte ich einige wenige Sprites in PICO erstellt, die mir visuell ganz gut gefallen haben. Das waren (und sind noch immer) längst nicht alle Sprites, die ich für das komplette Game brauche, aber damit kann ich vorerst arbeiten! Als nächstes musste ich also diese Sprites aus PICO in Codea importieren, um die Grundzüge meines Spiels zu programmieren. Und ich wurde sogleich mit einem Problem konfrontiert! PICO speichert seine Projekte in .p8 Dateien ab. Innerhalb einer solchen Datei befinden sich der Lua-Code, die Grafiken, die Sounds, Maps und anderes. Dabei sind die Grafiken als Bytecode hinterlegt. Jedes Byte ist eine X,Y Koordinate und eine Farbe auf dem Spritesheet. Dieser Byte-String muss also zunächst in RGBA's und X,Y Positionen umwandeln werden. Daraus erstellt man ein PNG Bild, das man wiederum als Datei speichern kann (die man später in Codea oder LOVE importieren kann). So ohne weiteres, konnte ich mein Spritesheet aus PICO also nicht bekommen!

Glücklicherweise gab es bereits jemanden, der dies mit einem Perl-Script gelöst hatte. Beim ausprobieren des Scripts stieß ich aber auf ein weiteres Problem. Ich bekam zwar meine Sprites als 128x128px Spritesheets exportiert, jedoch war der Hintergrund dieser Spritesheets ständig (deckend) Schwarz! PICO verwendet 16 Farben und Schwarz ist eine davon. In der PICO Konsole bedeutet Schwarz durchsichtig! Aber in einem Spritesheet ist Schwarz eben einfach Schwarz. Um den PICO-Effekt in Codea zu erzielen, müsste ich mit einem Shader arbeiten, der Schwarze Pixel einfach ignoriert. Dazu müsste ich diesen Shader jedoch jedem GameObject anhängen (vielleicht kann man auch einen Shader global schalten, ich kenne mich aber mit Shadern zu wenig aus, um zu sagen ob Codea so etwas auch kann). Shader wollte ich also, zumindest an dieser Stelle, vermeiden. Ich experimentierte einen ganzen Tag lang mit OpenGL BlendModes, weil ich dachte, dass ich das auch damit lösen könnte, aber damit kam ich auf keinen "grünen Zweig".

Den Schwarzen Hintergrund aus den Spritesheets manuell weg zu retuschieren kam gar nicht in Frage! Da ich kein Perl programmieren kann, blieb mir nichts anderes übrig, als das Script, in abgewandelter Form, in Lua umzusetzen. Und wenn ich schon dabei bin, würde ein anständiges GUI auch nicht schaden, statt den Export mit der Konsole erledigen zu müssen, wie es mit dem Perl-Script der Fall ist. Perfekter Zeitpunkt für LÖVE2D, um zu zeigen was es drauf hat!

Nach einem Tag Arbeit, war der PICO-8 Spritesheet Exporter endlich geboren! Mit diesem Tool kann ich nun per Drag & Drop aus PICO-8 Projekten Spritesheets generieren. Das ist nicht nur bequem sondern auch schnell.

Obwohl ich seit vier Jahren mit Lua programmiere und mich damit eigentlich ganz gut auskenne, war die Entwicklung dieses Tools aber auch nicht ganz ohne! Denn auch LOVE hat so seine "Macken". Ein gutes Beispiel dafür ist, dass sich LOVE in einer Art Sandbox befindet. Für das Interagieren mit Dateien (lesen, speichern) gibt es beispielsweise eine SaveDirectory. Um aber an die PICO Projekt-Dateien, die sich außerhalb dieses Ordners befinden, zu kommen, hatte ich nur drei Möglichkeiten: Manuelles Kopieren, Drag & Drop Support oder Lua's I/O Model. Manuelles hin-und-her Kopieren der Dateien kam gar nicht in Frage! Für das I/O Model hätte ich einen File-Manager programmieren müssen, mit dem ich Ordner durchsuchen und Dateien öffnen könnte. Doch zu Glück gab es da noch den Drag & Drop Support, der seit LÖVE 0.10.0 implementiert ist. Schmeißt man eine Datei auf das Programm-Fenster, bekommt man Zugriff darauf (lesen, schreiben, pfad). Das funktionierte perfekt!

Nachdem ich die gedroppte Datei gelesen und die Bytes der PICO Grafiken entschlüsselt hatte, konnte ich meine Spritesheets endlich erzeugen - aber am Abspeichern scheiterte es wieder. Ich konnte nicht aus der SaveDirectory raus! Nach einer Raucherpause kam die entscheidende Idee: Ich speichere mein generiertes Spritesheet in der SaveDirectory ab und benutze dann ein Shell-Script, dass auf allen Plattformen (macOS, Windows, Linux) funktioniert, um diese Datei dahin zu verschieben, wo das Original von PICO-8 liegt!

IMAGE:getData():encode("png", FILENAME)
os.execute("mv '"..love.filesystem.getSaveDirectory().."/"..FILENAME.."' '"..FILEPATH.."'")

Nachdem ich alle Funktionen meines Exporters fertiggestellt und in der Konsole ausgetestet hatte, konnte ich mein User Interface umsetzen. Um nicht unnötig Zeit zu verbrennen, habe ich alle Anzeigen als ein Bildelement platziert (inkl. Buttons). Um die Buttons anzusprechen, prüfe ich einfach die Position der Maus und kann somit entscheiden, ob sie auf dem Bild über einem Button ist. Ja, ja, ich weiß - ich bin ein Cheater ;D

Wer also seine Sprites in PICO-8 erstellt und gern exportieren möchte, um sie beispielsweise als Bild in sozialen Netzwerken zu teilen, oder in einem anderen Framework zu verwenden, kann gern meinen "PICO8PNG" Exporter kostenlos verwenden. Der Sourcecode befindet sich auf GitHub. Eine binäre Datei (eigenständige App) ist ebenfalls dabei, allerdings derzeit nur für Macintosh Computer. Windows und Linux, könnt ihr nach Bedarf selbst erstellen :)