2 Implementierung auf Basis von ANSI C und der Bibliothek SDL
Nachdem wir im ersten Kapitel bereits einiges über die Geschichte und die Theorie von 2-D-Computerspielen berichtet haben, steigen wir nun in die Praxis ein und präsentieren ein komplettes spielbares 2-D-Spiel für den PC (Windows, Linux) und andere Plattformen wie Raspberry Pi, Mac OS X, iOS und Android.
In diesem Kapitel springen wir direkt in die Praxis. In diesem shortcut geht es um 2-D-Spiele im Stil der 80er- und frühen 90er-Jahre. Diese Spiele sind meist relativ einfach aufgebaut, daher haben wir uns für den Einsatz relativ einfacher Technologien entschieden. Dennoch möchten wir, dass der Code portabel ist und auf fast jedem System übersetzt und ausgeführt werden kann.
Wir haben die Programmiersprache C gewählt, für die so ziemlich überall geeignete Compiler verfügbar sind. Und um nicht lange beschreiben zu müssen, wie geeignete Makefiles aufgebaut werden oder das Projekt in einem IDE zusammengestellt werden kann, verwenden wir den TinyC-Compiler [1]. Dieser Compiler wird zwar nicht mehr aktiv weiterentwickelt, ist aber für praktisch alle Systeme verfügbar, funktioniert sehr gut, erfordert keine umfangreiche Installation und reicht für unsere Zwecke völlig aus. Wenn Sie mit einem anderen Compiler oder einer komplexeren Entwicklungsumgebung als einem Texteditor arbeiten möchten, können Sie dies selbstverständlich tun.
Einige Hauptaufgaben bei Computerspielen sind die Darstellung von Grafiken, die Ausgabe von Geräuschen und Musik sowie die Abfrage von Tastatur-, Maus-, Joystick-, Controller- oder sonstigen Eingabegeräten. Das sind auch genau die Aufgaben, die am einfachsten mit portablen, genau auf diese Aufgaben spezialisierten Bibliotheken erledigt werden können. In diesem Kapitel verwenden wir die Bibliothek SDL [2], die für alle für unsere Zwecke relevanten Systeme verfügbar ist. Diese Bibliothek nimmt uns so viel Arbeit ab, dass wir uns im Code auf die wirklich wichtigen Dinge konzentrieren können: auf das Spiel!
Bomber – ein Klassiker
In diesem Kapitel entwickeln wir Schritt für Schritt den Quelltext für ein Spiel, das wir „Bomber“ nennen. Die Idee für das Spiel ist natürlich, wie sollte es bei einem shortcut über Retro-Games auch anders sein, abgekupfert. Das erste Spiel dieser Art hieß „Canyon Bomber“, stammte von Atari und wurde 1977 veröffentlicht. Von diesem Spiel gibt es unzählige Klone, so z. B. das bekannte „City Bomber“ von 1982, zu dem Sie weitere Details im Wikipedia-Artikel „City Bomber“ nachlesen können [3].
Die Spielidee ist denkbar simpel: Ein Flugzeug fliegt von links nach rechts über den Bildschirm. Im unteren Bereich ist die Skyline einer Stadt zu sehen. Durch Drücken der Space-Taste kann eine Bombe abgeworfen werden. Wenn die Bombe ein Haus trifft, wird es zerstört. Ziel ist es natürlich, alle Häuser der Skyline zu zerstören. Fliegt das Flugzeug rechts aus dem Bildschirm heraus, so erscheint es links wieder – allerdings etwas tiefer. Schritt für Schritt näher sich das Flugzeug also dem Boden. Falls es so tief kommt, dass es ein Haus berührt, ist das Spiel beendet.
Einrichten der minimalen Entwicklungsumgebung unter Windows
Die Einrichtung der „Entwicklungsumgebung“ unter Windows besteht aus einigen einfachen Schritten:
- Herunterladen des Tiny-C-Compilers [4]. Laden Sie die aktuelle Version tcc-0.9.26-win64-bin.zip herunter. Falls Sie ein 32-Bit-System verwenden, laden Sie tcc-0.9.26-win32-bin.zip herunter. Analoges gilt auch bei den Bibliotheken.
- Entpacken Sie die Datei. Hierbei entsteht das Verzeichnis \tcc\. Kopieren Sie dieses Verzeichnis an einen beliebigen Ort, z. B. nach C:\games.
- Laden Sie die SDL [2] herunter. Achten Sie dabei darauf, dass Sie mindestens die Version 2.0.4 herunterladen. Verwenden Sie nicht Version 1.2, da sie nicht kompatibel zu Version 2.x ist! Laden Sie auch die „Development Libraries“ herunter, sie beinhalten sowohl die Include-Dateien als auch die DLLs und die LIB-Dateien, die Sie für die Verwendung der Bibliothek benötigen. Die gewünschte Datei ist SDL2-devel-2.0.4-VC.zip.
- Laden Sie die SDL2-TTF-Bibliothek [5] herunter. Wir verwenden sie zur plattformunabhängigen Anzeige von Texten. Auch hierbei benötigen Sie die „Development Libraries“ mit dem Namen SDL2_ttf-devel-2.0.14-VC.zip.
- Entpacken Sie diese beiden Bibliotheken bzw. die heruntergeladenen ZIP-Dateien in ein beliebiges Verzeichnis, z. B. c:\games\tcc\games\SDL2-2.0.4 bzw. c:\games\tcc\games\SDL2_ttf-2.0.14.
- Laden Sie die Bibliothek SDL2_mixer herunter [6] und installieren Sie sie analog zu SDL2_ttf.
- Erstellen Sie ein Verzeichnis für den Quelltext des Spiels, z. B. c:\games\bomber.
- Laden Sie sich passende Geräusche für einen Schuss und eine Explosion herunter und legen Sie sie unter den Namen Glass_Break-stephan_schutze-958181291.wav bzw. shot.wav in das Verzeichnis c:\games\bomber. Sie können die Dateien natürlich auch beliebig anders benennen; dann müssen Sie lediglich die entsprechende Zeile im Quelltext anpassen. Beachten Sie bitte, dass die von uns als Beispiele ausgewählten Sounddateien lediglich zu Demonstrationszwecken dienen und nicht für kommerzielle Zwecke genutzt werden dürfen.
- Erzeugen Sie in diesem Verzeichnis eine Datei setenv.bat mit einem Inhalt gemäß Listing 2.1. Beachten Sie hierbei, dass die Pfade den von Ihnen gewählten Verzeichnissen entsprechen müssen. Bei 32-Bit-Systemen verwenden Sie jeweils die Unterverzeichnisse \x32\ anstelle von \x64\. Prüfen Sie doppelt, ob die Verzeichnisse bei Ihnen unter genau diesen Pfaden zu finden sind – beim Entpacken der Bibliotheken schleichen sich da leicht eine oder zwei weitere Ebenen ein.
- Erstellen Sie ein Verzeichnis für den Quelltext des Spiels, z. B. c:\games\bomber. Anstelle eines Makefiles oder einer umfangreichen Entwicklungsumgebung verwenden wir hier ein kleines Skript zum Übersetzen unseres Quelltexts. Erstellen Sie dazu eine Datei build_bomber.bat im Verzeichnis c:\games\bomber mit folgendem Inhalt:
tcc -o bomber.exe -DSDL_MAIN_HANDLED -I%SDLBASE%\include
-I%SDLTTFBASE%\include -I%SDLMIXERBASE%\include -L%SDLLIB%
-L%SDLTTFLIB% -L%SDLMIXERLIB% bomber.c -lSDL2 -lSDL2_ttf -lSDL2_mixer
- Laden Sie den Zeichensatz Millennia.otf [7] herunter und legen Sie ihn in das Verzeichnis c:\games\bomber. Beachten Sie bitte, dass es sich hierbei nicht um einen Open-Source-Zeichensatz handelt! Er ist kostenlos und Sie können ihn für Ihre Tests und die ersten Gehversuche verwenden. Sollten Sie aber tiefer in das Thema Spieleprogrammierung einsteigen wollen, sollten Sie entweder Zeichensätze kaufen oder tatsächlich freie Zeichensätze verwenden.
set BASE=c:\games
set TCCBASE=%BASE%\tcc
set GAMELIBS=%TCCBASE%\games
set SDLBASE=%GAMELIBS%\SDL2-2.0.4
set SDLLIB=%SDLBASE%\lib\x64
set SDLTTFBASE=%GAMELIBS%\SDL2_ttf-2.0.14
set SDLTTFLIB=%SDLTTFBASE%\lib\x64
set SDLMIXERBASE=%GAMELIBS%\SDL2_mixer-2.0.1
set SDLMIXERLIB=%SDLMIXERBASE%\lib\x64
set PATH=%PATH%;%SDLLIB%;%SDLTTFLIB%;%SDLMIXERLIB%;%TCCBASE%
Listing 2.1
Einrichten der minimalen Entwicklungsumgebung unter Linux
Unter Linux benötigen Sie dieselben Tools, Bibliotheken, Zeichensätze und Sounddateien wie unter Windows. Sie können diese entweder ebenfalls von denselben Webseiten herunterladen wie die Windows-Versionen, oder Sie verwenden den Paketmanager Ihrer jeweiligen Linux-Distribution zur Installation. Falls Sie den Paketmanager verwenden oder feststellen, dass z. B. die SDL bereits auf Ihrem System installiert ist, achten Sie genau auf die Versionsnummer. Verwenden Sie keine ältere Version als 2.0.4 – es kann sonst zu Inkompatibilitäten kommen. Listing 2.2 zeigt, wie die Bibliotheken mit dem Paketmanager apt installiert werden können. Den Zeichensatz und die Sounddateien müssen Sie dennoch manuell herunterladen.
sudo apt-get install build-essential
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-gfx-dev
sudo apt-get install libsdl2-image-dev
sudo apt-get install libsdl2-mixer-dev
sudo apt-get install libsdl2-net-dev
sudo apt-get install libsdl2-ttf-dev
Listing 2.2
Unter Windows übersetzen wir den Quelltext mit dem Skript build_bomber.bat. Unter Linux können Sie ein ähnliches Skript erstellen und es build_bomber.sh nennen (Listing 2.3). Das Listing zeigt, wie der GCC verwendet werden kann, weil dies unter Linux eine sehr natürliche Wahl für den C-Compiler ist. Falls Sie den TinyC-Compiler verwenden möchten, können Sie das Listing ganz einfach anpassen.
rm *.exe
rm *.o
gcc -c bomber.c -I/usr/local/include/SDL2
gcc -o bomber.exe bomber.o -lSDL2 -lSDL2_ttf
Listing 2.3
Ein erster Test
Listing 2.4 zeigt das Grundgerüst einer einfachen SDL-Anwendung, die auch plattformunabhängige Zeichensätze lesen und Texte ausgeben kann. Mit diesem Listing können Sie sehr einfach testen, ob der Compiler und die Bibliotheken korrekt eingerichtet sind. Öffnen Sie hierzu eine Kommandozeile (cmd.exe unter Windows bzw. die Shell Ihrer Wahl unter Linux) und gehen Sie in das Verzeichnis /bomber/. Führen Sie dort...