zurück zur Hauptseite

Harald Hoppelhase

Highscorejagt auf einer endlos wachsenden Pflanze

Über das Spiel

Harald Hoppelhase entstand ursprünglich im Rahmen eines 1-wöchigen Zfx-Game-Jams über Ostern. Ich wollte irgend etwas osterliches machen, mit frischen Frühlingsfarben und bunten Eiern. Außerdem sollte es ein prozedurales Spiel mit Highscorejagt werden, denn um viele Levels oder eine richtige Story einzubauen hatte ich nicht genug Zeit. Als Kind habe ich gerne Icy Tower gespielt, und ich dachte mir, ein ganz ähnliches Spielprinzip könnte hier auch gut funktionieren: Ein süßes Häschen findet eine magische Pflanze, die immer weiter in den Himmel wächst und das Ziel ist es, sie so weit wie möglich nach oben zu erklimmen und dabei möglichst viele bunte Ostereier einzusammeln um Punkte zu sammeln.

Je höher man kommt, desto schwieriger werden die Sprünge: Blätter werden kleiner, sind weiter voneinander entfernt und haben schräge Winkel. Da die Pflanze endlos wächst gibt es nach oben kein Limit, aber irgendwann wird der Schwierigkeitsgrad nicht mehr höher, damit es immer schaffbar bleibt. In der Praxis dauert ein Durchlauf aber trotzdem nie mehr als ein paar Minuten, da irgendwann jeder einen kleinen Fehler macht.

Um das Spiel interessanter zu machen, gibt es außerdem zwei zusätzliche Spielelemente:

Zum einen können Möhren eingesammelt werden um einen Supersprung aufzuladen. Dieser ist entweder ein besonders hoher Sprung von einem Blatt aus, oder ein Doppelsprung mitten in der Luft. Letzteres ist besonders nützlich um missglückte Sprünge zu korrigieren - schnell ausgeführt ermöglicht er es ein Blatt doch noch zu erreichen und funktioniert somit fast wie ein Extraleben.

Zum anderen kann man auf schrägen Blättern nach oben hoppeln und so Anlauf für einen höheren Sprung nehmen. Ohne zusätzliche Tasten zu benötigen kann man so auf verschiedene Arten vom Blatt abspringen, was das Spielgeschehen etwas komplexer macht. Benötigt werden diese besonders hohen Sprünge aber erst später im Spiel.

Die Pflanze

Das komplexeste Objekt im Spiel ist die magische Pflanze, die endlos in den Himmel wächst. Wie es sich für ein Spiel dieser Art gehört, sollte das Level zufällig generiert sein, damit es bei jedem Neustart anders aussieht. Im Vergleich zu Spielen wie Icy-Tower können die Blätter (die hier als Plattform dienen) allerdings nicht komplett zufällig platziert werden - die Pflanze soll organisch wachsen, aber die einzelnen Blätter müssen trotzdem einerseits immer erreichbar bleiben und andererseits eine interessante Herausforderung bieten. All diese Kriterien gleichzeitig zu erfüllen war der interessanteste Teil an der Entwicklung. Hier ist das Ergebnis:

Die wachsende Pflanze

Die Wachstumsanimation der Pflanze war auch nicht einfach: Einerseits soll der Spieler sehen, wie die Pflanze vor seinen Augen wächst, andererseits müssen die Blätter über Harald aber immer schon da sein, damit man den nächsten Sprung planen kann. Das Wachstum muss sich also dynamisch an die Eingaben des Spielers anpassen, das die "Wachstumsstufen" in der Animation oben erklärt.

Die Pflanze wackelt auch ein wenig, wenn Harald auf ein Blatt hüpft. Ich hatte überlegt eine kompletten Physik-Simulation einzubauen, aber das hätte neben der Komplexität in der Physikberechnung auch das Erstellen sinnvoll spielbarer Level (kniffelig, aber immer schaffbar) noch viel komplizierter gemacht. Insgesamt war ich dann mit dem aktuellen Ergebnis zufrieden genug um es erstmal so zu belassen.

Für die Verteilung der Blätter habe ich einen Algorithmus entworfen der Blätter nur dann platziert, wenn sie garantiert auch erreichbar sind. Das ist schwieriger als man zunächst meinen mag, muss man beispielsweise weit zur Seite springen, darf das Blatt weniger weit über den aktuellen sein, als wenn man direkt darunter sitzt. Über die Details schreibe ich hoffentlich demnächst noch einen ausführlichen Artikel.

Die Grafik

Auch bei der Grafik wollte ich gerne etwas neues lernen und habe mich für einen Handgezeichnet-Stil entschieden. Ich machte also ein paar Referenzfotos und versuchte eine Tulpe in Krita nachzuzeichnen:

Referenzfoto und erste Testzeichnung

Das Ergebnis gefiel mit gut genug um zu versuchen, ein ganzes Spiel in diesem Stil umzusetzen.

Neben den statischen Spielelementen wie die Eiern, Möhren und Hintergrundbildern gab es dann noch Hase Harald, der komplexe Animationen benötigte. Die einzelnen Körperteil wurden in der Grundpose in Krita gemalt und anschließend als einzelne Sprites exportiert. Diese wurden dann in Blender importiert und auf ein grobes Dreiecks-Mesh gepackt, welches dann wie ein herkömmliches 3D Modell per Bones animiert werden kann. Im Gegensatz zu "Daumenkino-Sprites" können diese Animationen beliebig interpoliert und mit einer hohen Framerate abgespielt werden, was alle Bewegungen und Übergänge recht flüssig werden lässt.

Haralds Körperteile
Das Modell in Blender
Die Hoppelanimation im Spiel

Die Hoppelanimation selber entstand auf Grundlage verschiedener Onlinevideos, unter anderem aus einem Streichelzoo :)

Online-Highscore

Da es nur relativ wenige Spielelemente gibt und der generelle Spielablauf immer gleich bleibt besteht die Hauptmotivation im Erreichen der höchstmöglichen Punktzahl. Dafür habe ich zum ersten mal Onlinefeatures eingebaut, damit man gegen Spieler auf der ganzen Welt antreten kann.

Serverseitig ist die Highscoreliste durch ein paar simple php-Scripte implementiert, die einen neuen Eintrag entgegen nehmen, auf dem Server speichern und die komplette Liste ausgeben können. Die Skripte sind nicht besonders ausgefeilt und vermutlich skaliert die Lösung nicht sehr gut, aber ich erwarte auch einfach nicht, dass mehrere tausend Einträge pro Sekunde eingereicht werden.

Man würde meinen, dass es reicht den Namen und die Punktzahl an den Server zu schicken - aber wenn man es richtig machen will, braucht man noch einige zusätzliche Felder:

Die Highscoreliste im Spiel hat insgesamt 12 Einträge, aber es werden jeweils nur die besten 6 vom Server synchronisiert. So ist sichergestellt, dass man immer ein paar Highscoreplätze für seine eigenen Durchläufe hat und so seinen eigenen Fortschritt sieht, auch wenn man niemals das Niveau der Online-Community erreichen sollte.

Die Highscoreliste wird auch lokal gespeichert und sollte einmal keine Internetverbindung bestehen, werden Einträge einfach später synchronisiert. Zusätzlich können sämtliche Onlinefeatures vor dem ersten Start komplett deaktiviert werden, wenn man auf Privatsphäre großen wert legt.

Um die Verbindung zum Server zu verschlüsseln wird übrigens ein Wrapper für OpenSSL verwendet. Das ist zwar ein wenig unnötig, weil alle Daten per Definition öffentlich sind, gehört aber irgendwie zum guten Ton. Und außerdem erlaubt mein Webserver keine unverschlüsselten Verbindungen mehr :D

Spieleinstieg

Um die Grundzüge des Spiels zu erklären gibt es ein einfaches Ingame-Tutorial. Durch Hinweistafeln wird dem Spieler erklärt, was er tun muss und es wird sichergestellt, dass man jede Mechanik einmal korrekt angewendet hat, bevor man das Ziel erreichen kann. Man hätte am Tutorial vieles vermutlich noch schicker machen können, aber für ein kurzes Level, dass von jedem Spieler im Idealfall nur einmal gespielt wird, wollte ich dann doch nicht zu viel Zeit investieren.

...
Das interaktive Tutorial
...
Ein Anleitungsbildschirm im Hauptmenü

Download

Aktuell gibt es nur eine Windows-Version. Wenn du Interesse hast den Source-Code für Mac oder Linux zu kompilieren, melde dich bitte.

Harald Hoppelhase (deutsch + englisch, Windows, ca. 27 MB)

Kontakt

Für Fragen, Anregungen oder Feedback schreibt ihr am besten eine EMail (ich freue mich über jede):

JonathanK@posteo.de