Controller Brawler Repair Force

Global Game Jam 2020 Postmortem

Thema des Global Game Jams 2020 war “Repair”.
Unsere Idee zu dem Thema “Reparieren”: der Spieler startet mit einem kaputten Gamepad und im Laufe des Spiels muss das Gamepad repariert werde um neue Sachen im Spiel frei zu schalten. Wir wollten ein local Party Game für 4 Spieler machen, bei dem jeder Spieler mit einem Gamepad spielt. Das Ergebnis ist unser Spiel Brawler Repair Force

Die Spieleidee

Nach mehreren Idee Iterationen haben wir uns entschlossen ein Top Down Game mit fester Spielfeldgröße wie bei Bomberman zu machen. Der twist ist das kaputte Gamepad das der Spieler reparieren muss, um alle Skills der eigenen Spielfigur frei zu schalten. Die 4 Skills die wir auf die 4 Gamepad-Buttons gelegt haben sind der Dash (eine kurze Strecke schnell laufen), schlagen, schießen und ein Schild. Aber auch die 4 Richtungen zum Laufen haben wir als Skills verstanden. Jeder Button ist dafür in 4 Teile geteilt und erst, wenn alle 4 Teile eines Buttons im Besitz des Spielers sind funktioniert der Skill hinter diesem Button. Von den Richtungen, in die man laufen kann, sind 2 orthogonale Richtungen von Anfang an immer zufällig fest repariert. Das war wichtig, damit man zu jeder Zeit jeden Punkt des Spielfeldes erreichen kann, da man oben auf dem Bildschirm raus kommt wenn man unten das Bild verlässt. Wenn die Skills Schlagen und Schießen repariert sind bevor das komplette Gamepad repariert ist, stunnen diese Attacken den gegnerischen Spieler für X Sekunden. Sobald alle Buttons des Spielers repariert sind, sind seine Attacken tödlich und die anderen Spieler können aus dem Spiel geschmissen werden. Damit alle Spieler informiert sind, dass der Mitspieler jetzt tödliche Attacken ausführen kann, hat jeder Spieler mit einem reparierten Gamepad eine Krone auf. Um einen Button des Gamepads zu reparieren müssen die Teile des Buttons eingesammelt werden. Die Teile regnen zufällig auf das Spielfeld, es fallen aber nur Teile auf das Spielfeld die mindestens ein Spieler noch braucht. Können z. B. alle Spieler dashen, so würden keine Teile des X Buttons mehr auf das Spielfeld fallen.

Das Team

Unser Team auf dem Global Game Jam (GGJ) in Bremen bestand aus Jan Niklas, Pablo, Timo und Kolja. In diesem Team haben wir bereits in vergangenen GGJs teilgenommen. Wir nehmen zum Teil schon seit 2010 regelmäßig am GGJ und anderen Jams Teil. Das Format war also allen gut bekannt.

Ablauf eines GGJs

Der Ablauf des GGJs wird fest vom Zeitplan bestimmt. Denn nach 48h sollte bei jedem Team ein fertiges Spiel stehen. Sobald das Thema des Jams durch ein kurzes Video vorgestellt wurde, in diesem Fall “Repair” werden die ersten Stunden dafür verwendet eine Spielidee auf Papier zu skizzieren. Hierbei werden wild Ideen zu dem Thema gesammelt und geguckt ob sich ein Spiel aus den Ideen entwickeln lässt. Wir nutzen die erste Zeit auch immer schön parallel um die wichtigsten Voraussetzungen einzurichten. Dazu gehört ein Gruppenchat, ein GDoc oder ein PiratePad, ein Git Repo mit Issues Tracker (GitLab). Außerdem werden auf den PCs der Teilnehmer die Entwicklungsumgebungen installiert/aktualisiert. In Bremen endet die Phase der Ideenentwicklung mit einer kurzen Präsentation aller Teams in der in je 1-3 Minuten die Idee allen vorgestellt wird. Gefolgt von Pizza (einem wichtigen Element eines Game Jams) für alle. Gut gesättigt fängt dann die Umsetzungsphase an. Sind 24 der 48 Stunden vergangen gibt es eine Zwischenpräsentation in der jedes Team 2-3 Minuten Zeit hat um zu zeigen wie weit sie sind. Viel Pizza, Kaffee und Snacks und 47 der 48 Stunden später wird aus Übermüdung Hektik. Das fertige Spiel muss auf die GGJ Webseite hochgeladen werden, letzte Bugs müssen behoben werden. Einfach alles damit die finale Präsentation gut läuft. Jetzt läuft der Countdown auf 00:00:00 und alle freuen sich über die Leistungen der letzten 48 Stunden. In der finalen Präsentation zeigen alle Teams ihre Spiele. Manche Teams lassen ander Teilnehmer des Jams ihr Spiel spielen, das sie nur kurz aus den Zwischenpräsentation kennen. Nicht jede Präsentation läuft ohne Bugs ab aber das gehört dazu und dann wird halt das Spiel nochmal neu gestartet. In einer abschließenden Bewertungsrunde bewerten wir alle Spiele gegenseitig um ein Jam Gewinner zu küren.

Was ist ein PC Spiel aus der Sicht der Programmierung?

Plump gesagt besteht jedes Spiel aus 3 Schritten die 60 Mal pro Sekunde ausgeführt werden. Alle Eingaben sammeln. Gamepads der Spieler und ggf. Netzwerkdaten bei Online spielen Position aller Elemente im Spiel verschieben je nach den Daten der Eingaben Malen aller Elemente im Sichtfeld und Wiedergabe von Sound Durch die hohe Frequenz entsteht für den Spieler eine flüssige Bewegung die auf die Eingaben reagiert. Was hier sehr einfach skizziert ist, ist Grundlage von jedem Spiel. Und ist unter Umständen mehr oder weniger komplex umgesetzt.

Die Technologie

Viele Teams setzen auf Jams auf die großen 3D game engines wie Unity oder Unreal aber auch kleinere Engines wie Godot werde oft benutzt. Diese Engines setzten in vielen Bereichen Vorkenntnisse in der Bedienung voraus und Dokumentationen, die man Online findet, haben durchwachsene Qualität. Wir gehen schon seit längerem einen anderen Weg und setzen auf JNGL eine minimale 2D Engine entwickelt von Jan Niklas die mit dem Spiel Portal Dogs auch in einem kommerziellen Spielen im Einsatz ist. Hier müssen wir zwar vieles selbst entwickeln, was wir benötigen, aber haben dadurch die 100%ige Flexibilität und kennen unser Werkzeug C++ bereits sehr gut.

JNGL

JNGL ist eine C++ Engine mit Unterstützung für Python. Wir haben unser Spiel in C++ entwickelt. Dafür muss man den C++ Compiler und die Boost Bibliothek installieren. Als Editor haben wir Visual Studio Code benutzt ein leichter Code Editor, der durch Plugins um die Unterstützung für verschiedene Programmiersprachen erweitert werden kann.

GIMP

Um unsere Bilder für unser Spiel zu malen haben wir uns für Pixel Art entschieden. Dabei ist es wichtig, dass die Pixel der Objekte ungefähr gleich groß sind. Unser Vorgehen war dabei wie folgt. Geht man von dem vollen Bildschirm und einer Auflösung von 1920x1080 aus haben wir uns dafür entschieden das jeder Pixel im Bild aus 4x4 also 16 Pixeln auf dem Bildschirm entsprechenden. Ein gutes vorgehen um ein gutes Ergebnis zu erzielen ist es in GIMP mit einem Bild zu starten das 1920/4x1080/4 groß ist. Mit einem Zoom von 400% sieht man jetzt die Pixel genug so groß wie im finalen Spiel. Auf dieser Fläche können jetzt z.B. die Figuren der Spieler gezeichnet werden. Am Ende werde die Figuren ausgeschnitten und in einzelnen Dateien gespeichert. Beim Zeichnen ist es wichtig, dass ein digitaler Pinsel/Stift benutzt wird der harte Kanten zeichnet, genau die machen ja den Pixel Art Look aus.

Animationen

Um 2D Animationen zu erstellen haben wir zwei der gängigen Verfahren benutzt. Bild für Bild Animationen Hier werden wie in einem Daumenkino die Bilder alle einzeln gezeichnet und nacheinander an der gleichen Stelle gezeichnet. Diese Art der Animation haben wir verwendet um die Spieler oder den Energieball des Schusses zu animieren. Der Aufwand steigt hier mit der Länge der Animation und sieht blockartig aus wenn man zu wenige Bilder benutzt. Ein Effekt der bei Pixel Art durchaus ab und zu gewollt ist. Spine Animation / Key Frame Animation Für das Intro und den Gewinner Screen haben wir Spine verwendet, hier wird ein Bild aus mehreren Ebenen und vielen kleinen Bildern durch virtuelle Knochen zusammengesetzt. Die Knochen werden dann bei der Animation bewegt und bewegen die kleinen Bilder. Die Bewegungen werden hierbei als Kurve von Start bis Zielpunkt abgespeichert und erst zur Laufzeit im Spiel zusammengesetzt. Das führt zu weichen Animationen mit 60 Bildern pro Sekunde. Die Größe der Animation wird nur noch durch die Anzahl der Elemente, nicht mehr wirklich durch die Länge der Animation beeinflusst.

Sound

Die Hintergrundmusik ist mit den Online Midi Editor erstellt worden. Die Soundeffekte haben wir auf dem Jam aufgenommen und sind zum Teil mit dem Mund gemacht.

Die Skills im Detail

Dash gibt dem Spieler in die aktuelle Bewegungsrichtung eine Geschwindigkeitsschub um den Faktor X. Das Schlagen stunnt oder tötet alle Gegner in einem Umkreis von Y. Der Schuss spawned einen Energieball der langsam über das Spielfeld in die Bewegungsrichtung fliegt. Berührt der Ball einen Spieler wird dieser gestunnt oder getötet. Fliegt der Ball aus dem Bildschirm wird das Objekt des Balls aus dem Spiel entfernt. Das Schild schützt einen gegen attacken von anderen Spielern

Die Entwicklung des Spiels

Um dem weiteren Teil des Postmortem zu folgen, empfiehlt es sich JNGL zu installieren. Dann kann das Spiel in den unterschiedlichen entwicklungsstufen ausprobiert werden.

In das Repository des Spiels wurden 226 Commits hochgeladen. Fast gleich über die beide Tage verteilt.
  • 01 Feb, 2020 115 commits
  • 02 Feb, 2020 111 commits
  • Alle Commits wurden direkt in Master gepushed. Im Issue Tracker wurden 69 Issues eingetragen, davon sind immer noch 5 Issues offen 160 Pipelines haben die unterschiedlichen versionen gebaut.

    Key commits zum nachstellen des Fortschritts

  • Alle Videos zusammen als Playlist
  • 465c32dc - Erster Build der durchgelaufen ist hat nur eine weißen Screen angezeigt.
  • ee8358c4 - Eine Spielerklasse erstellt. Und das Bild des Spielers hinzugefügt
  • 39c0e6f8 - Der Spieler bewegt sich nach links, wenn man nach Links drückt.
  • d6b9b885 - Bilder für den Spieler aus allen 4 Richtungen
  • 73fa0952 - Der spieler bewegt sich mit den Pfeiltasten in alle richtungen
  • a99daa93 - 4 Spieler sind im Spiel, bewegen sich aber noch alle gleichzeitig
  • 11bc1a5b - Jeder Spieler hat eine eigene steuerung
  • 8f6fc0f9 - Animationen und schatten für die Spieler
  • 3d511faa - Ab jetzt haben wir hintergrund Musik
  • 894a0611 - Die Splitter der Gamepad Buttons lassen sich einsammeln
  • 954f847d - Intro Movie mit Spine
  • 9158c970 - Dash für den Spieler implementiert (WSAD + Ctrl)
  • ea0e074d - HUD mit einem counter für die gesammelten Teile
  • 63a0c549 - HUD als Gamepads und Button splitter fliegen an die richtige stelle
  • c0b7f688 - Hintergrundbild für den Boden
  • 65c58efe - Die Gamepads kleiner und die Abfrage der Buttons geht
  • e0362e52 - Button splitter auf zufälligen Positionen erstellen
  • cd3d1912 - Ein Sound beim einsammeln von Button splittern
  • a026a940 - Die Gamepads werden durchsichtig wenn man durchläuft
  • df04a97e - Gewonnen Animation
  • acbd6925a - Icon für das Spiel
  • 0205aee8 - Die Splitter fliegen beim start aus dem Spieler raus
  • ae33fb87- Button Vibrationen
  • 09e125e9 - Schießen vom Ball und
  • Schild mit animation (wurde schon früher implementiert)
  • 5874316c - Button Splitter fallen von Oben herein
  • 160cdcc2 - Button Splitter verschwinden nach einer zeit wieder
  • 08f7d5e6 - Boxen auf dem Spielfeld
  • 30140d5b - Button blinken, wenn man versucht kaputte Buttons zu benutzen
  • b389481e - Gewinn bedingung ist jetzt nicht mehr alle teile zu haben sondern alle Teile haben und dann die Gegner zu killen
  • c27ccf85 - Krone für jeden der sein Gamepad repariert hat
  • 4eb14de0 - Intro zeigt an wie die Tastenbelegung ist
  • Und sobald einer König ist, ändert sich die Musik
  • 0ed3609f - Finales Spiel