Controller Brawler Repair Force

Global Game Jam 2020 Revue

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 Spieles muss das Gamepad repariert werden, um neue Sachen im Spiel freizuschalten. Wir wollten ein lokales 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 einem intensiven Brainstorming haben wir uns entschlossen, ein Top Down Game mit fester Spielfeldgröße wie bei Bomberman zu entwickeln. Der Twist dabei ist, dass kaputte Gamepad, das der Spieler reparieren muss, um alle Skills der eigenen Spielfigur freizuschalten. 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 bereits repariert. Das war wichtig, damit man zu jeder Zeit jeden Punkt des Spielfeldes erreichen kann, da man oben auf dem Bildschirm rauskommt, wenn man unten das Bild verlässt. Wenn die Skills Schlagen und Schießen repariert sind, bevor das komplette Gamepad repariert ist, lähmen 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 an vergangenen GGJs teilgenommen. Einige von uns nehmen 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 48 Stunden sollte bei jedem Team ein fertiges Spiel entstanden sein. 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 schon parallel, um die wichtigsten Voraussetzungen einzurichten. Dazu gehört ein Gruppenchat, ein Google Doc oder ein PiratePad und 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 und 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 andere 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 das Spiel einfach 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?

Einfach gesagt besteht jedes Spiel aus 3 Schritten die 60-mal pro Sekunde ausgeführt werden. Der erste Schritt besteht daraus, alle Eingaben zu sammeln: Gamepads der Spieler und ggf. Netzwerkdaten bei Onlinespielen. Der zweite Schritt beinhaltet, die Positionen aller Elemente im Spiel zu verschieben je nach den Daten der Eingaben. Der dritte Schritt ist das Zeichnen aller Elemente im Sichtfeld und die 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 bei 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. JNGL ist eine minimale 2D Engine entwickelt von Jan Niklas, die mit dem Spiel Portal Dogs auch in einem kommerziellen Spiel im Einsatz ist. Hier müssen wir zwar vieles selbst entwickeln, aber haben dadurch die hundertprozentige 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 zeichnen, 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 entspricht. Um ein gutes Ergebnis zu erzielen, haben wir in GIMP mit einem Bild gestartet 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 werden die Figuren ausgeschnitten und in einzelnen Dateien gespeichert. Beim Zeichnen ist es wichtig, dass ein digitaler Pinsel/Stift benutzt wird, der harte Kanten zeichnet. Denn genau diese machen ja den Pixel Art Look aus.

Animationen

Um 2D Animationen zu erstellen haben wir zwei der gängigen Verfahren benutzt.

1. 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 zeitliche 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.

2. 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 dem Online Midi Editor erstellt worden. Die Soundeffekte haben wir auf dem Jam selber aufgenommen, sie sind mit vollem Körpereinsatz entstanden.

Die Skills im Detail

Der Dash gibt dem Spieler eine Geschwindigkeitsschub in die aktuelle Bewegungsrichtung um den Faktor X.
Das Schlagen lähmt oder tötet alle Gegner in einem Umkreis von X.
Das Schild schützt einen gegen Attacken von anderen Spielern
Der Schuss feuert einen Energieball ab, der langsam über das Spielfeld in die Bewegungsrichtung des Spielers fliegt. Berührt der Ball einen Spieler wird dieser gelähmt oder getötet. Fliegt der Ball aus dem Bildschirm wird dieser aus dem Spiel entfernt.

Die Entwicklung des Spieles

Um dem weiteren Teil dieses GGJ-Revues zu folgen, empfiehlt es sich, JNGL zu installieren. Dann kann das Spiel in den unterschiedlichen Entwicklungsstufen ausprobiert werden.

In das Repository des Spieles wurden 226 Commits hochgeladen. Fast gleich über die beiden GGJ-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.

    Die wichtigsten Commits zum Nachstellen des Fortschrittes:

  • Alle Videos zusammen als Playlist
  • 465c32dc - Der erste Build der durchgelaufen ist, hat nur einen 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 Hintergrundmusik.
  • 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 - Das 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 von Energiebällen und
  • das Schild mit Animation (wurde schon früher implementiert)
  • 5874316c - Button-Splitter fallen von Oben herein.
  • 160cdcc2 - Button-Splitter verschwinden nach einer festgelegten Zeit wieder.
  • 08f7d5e6 - Boxen auf dem Spielfeld
  • 30140d5b - Button blinken, wenn man versucht kaputte Buttons zu benutzen.
  • b389481e - Die Gewinn-Bedingung ist jetzt nicht mehr, alle Teile zu haben sondern alle Teile zu haben und dann zusätzlich die Gegner zu killen.
  • c27ccf85 - Krone für jeden, der sein Gamepad komplett repariert hat.
  • 4eb14de0 - Intro zeigt an wie die Tastenbelegung ist.
  • Sobald einer König ist, ändert sich die Musik.
  • 0ed3609f - Finales Spiel