Applets coden, das macht Spaß

Als kleines Nebenprojekt hab ich jetzt 2 Wochen damit verbracht, ein Java Game in ein Applet zu verwandeln, damit es im Browser spielbar ist. Hier meine Erfahrungen…

Ausgangslage

The Legend of Ethos ist ein 2D RPG, entstanden im 3. Semester Medientechnik und -design an der FH Hagenberg. Projektleiter war mein Bruder Peter, der mit 3 Studienkollegen ein sehr ambitioniertes Konzept umgesetzt hat. Das Spiel erinnert mit seiner Top-Down Ansicht einer Tile-basierten Welt und den Monster-Kämpfen an die alten Pokémon-Spiele. Das Team hat es geschafft, eine spielbare Kampagnie mit mehreren Quests zu erschaffen, welche in ca. 1 Stunde durchgespielt werden kann. Das ein Game in einem Semester so weit kommt, sieht man selten!

Ethos stand seit der Fertigstellung zum Download bereit, das kam mir jedoch zu umständlich vor. Als Fan wollte ich es gerne einfach im Browser spielen! Also beschloss ich, ein Applet draus zu machen.

Spaß mit JARs

Okay. Game Engine upgedated auf die neueste Golden T. Jetzt den Source Code und die Assets in JARs verpacken, was im Grunde ZIP-Dateien sind. Was wiederum bedeutet, dass sich alle Pfade ändern und alle Referenzen im Code auf ein Bild oder ein Sound geändert werden müssen. Leider gab es noch keine Funktion, die alle Assets beim Spielstart ladet und den anderen Klassen zur Verfügung stellt. Die meiste Zeit war ich also damit beschäftigt, eine solche Funktion zu erstellen und alle Datei-Anfragen umzustellen.

Was mir sehr viel Kopfzerbrechen bereitet hat: Es wurden oft Pfade zu Bilder angegeben, die Ordner waren. Das Spiel ladete dann alle im Ordner enthaltenen Bilder. Sicher praktisch beim Entwickeln der Assets, aber problematisch fürs Web. Man kann vielleicht noch einen Ordner von einer Datei mithilfe der Dateiendung unterscheiden, aber dann nicht eine Liste aller im Ordner enthaltenen Dateien bekommen. Ich habe lange nach einer Lösung gesucht, die dies doch ermöglicht. Dabei bin ich auf diese Funktion gestoßen, die aber leider nicht funktioniert, wenn sich das JAR mit den Assets auf einem HTTP Server befindet.

Im Endeffekt habe ich eine XML-Datei mit einer Liste aller Bilder erstellt, die geladen werden sollen. Nicht so flexibel, aber es funktioniert.

Audio, f*$%ing Audio

Die gleiche Geschichte betrifft natürlich auch die Audio-Dateien, wovon es zum Glück weniger Stück gab. Die Dateien waren im speicherhungrigen WAV-Format. Dass sie in etwas fürs Web taugliches umgewandelt werden mussten, war klar. Welche Formate werden aber unterstützt? Mit Add-ons sind das Ogg Vorbis und MP3. Diese Add-ons zu integrieren war zum Glück nicht schwer oder zeitaufwändig. Lange probierte ich es mit dem JOrbisOggRenderer, aber es gab Probleme…

Lokal lief alles noch gut. Als ich glaubte, mein Job sei erledigt, ladete ich alles auf einen Webserver. Dort kam dann der Fehler:

Exception in thread “Thread-13” java.lang.NoClassDefFoundError: com/jcraft/jogg/SyncState
at org.newdawn.slick.openal.OggInputStream.<init>(OggInputStream.java:40)

Hä? Viele Google-Suchen später, keine brauchbare Lösung. Anscheinend konnte das Applet die für Audio zuständigen Klassen jogg-0.0.7.jar und jorbis-0.0.15.jar plötzlich nicht mehr finden. Diese müssen im Build Path stehen. Ich hab hier alles versucht:

  1. Im <applet> Tag standen diese JARs schon
  2. Im Manifest aller JARs hab ich sie im Class-Path hinzugefügt
  3. Natürlich auch im Eclipse-Projekt (macht nen Unterschied?)

Ist mir ein Rätsel. American Hero läuft mit genau diesen JARs und spielt Ogg Vorbis ab. Habs dann einfach mit dem JavaLayerMp3Renderer (MP3) versucht. Hat sofort funktioniert. Arrrgh!

Applet Debugging

Testen, Testen, Testen… Bei Applets dauerts gefühlte 10 Minuten, bis man eine Änderung im Code ausprobieren kann. Es ist so wie C++ Code kompilieren, nur dass man nicht einfach wartet und nebenbei surfen kann, sondern man jedes Mal eine handvoll Schritte ausführen muss. Okay, zugegebenermaßen hab ich es mir vielleicht selbst schwierig gemacht. Aber so hat das ausgeschaut:

  1. Java-File abspeichern.
  2. Im Task-Manager java.exe abwürgen.
  3. BAT-Datei starten, die die JARs erzeugt.
  4. Mithilfe der Uhrzeit checken, ob wirklich neue JARs erzeugt wurden.
  5. Refresh im Browser.

Alternativ kann man auch den Browser jedes Mal nach einem Crash komplett schließen, dann wieder neu starten. Ist aber blöd, wenn man andere Tabs offen hat.

Dateigrößen

Nachdem alle nicht verwendeten Assets gelöscht, die Sounds als MP3s gespeichert wurden und alles durch den JAR Maker gejagt wurde, siehe da: Das Spiel ist 8 MB groß. Immer noch viel, aber in Zeiten wo das durchschnittliche YouTube Video mehr hat, durchaus akzeptabel. Leider gibt es keine Ladebalken, man muss also einige Zeit auf einen schwarzen Bildschirm starren, bis sich was tut.

Das Ergebnis

Nun ist es also endlich soweit… Bitteschön, The Legend of Ethos spielbar im Browser. Hier einige interessante Links dazu:

Leave a Reply

Your email address will not be published.