Satyria

Das erste Programm

Mit diesem Tutor möchte ich Euch ein wenig das SDL (Simple DirectMedia Layer) Programmieren zeigen. Wie ich bereits zuvor geschrieben habe, benutzen wir hierfür eine Windowsumgebung und MSYS2.
Aber fangen wir gleich an, damit wir auch was sehen, hier das erste Beispiel:

Sourcecode: 1.c

Kompiliert wird es mit:

gcc -o 1.exe 1.c -Ic:/msys64/mingw64/include -Lc:/msys64/mingw64/lib -lmsys-2.0 -lSDL2main -lSDL2 -mwindows

und ausgeführt wird es mit:

./1

Bei diesem Programm wird ein SDL-Fenster für 2000 Millisekunden geöffnet.

Zunächst muss man den Kompiler mitteilen, welche Header benötigt werden. die geschieht mit #include <SDL2/SDL.h>. Danach definiere ich zwei Konstanten, die mir die Fenstergröße festlegen. Der globale Variable fenster wird das SDL_Window zugewiesen. Diese wird später das Fenster beherbergen. Da C alle Funktionen bekannt sein müssen, wird hier die Funktion Initialisierung() bekannt gemacht. Was darin steht, kommt später.

Im eigentlichen Hauptprogramm (main) steht dann allerdings relativ wenig. Zunächst wird die Funktion der Initialisierung ausgeführt und anschließend wird mit SDL_Delay 2000 Millisekunden gewartet. Danach wird das Programm beendet.

In der Funktion Initialisierung() steht da schon mehr. Zunächst muss man SDL Initialisieren, damit überhaupt SDL funktioniert. Dies geschieht mit SDL_Init. Hier wird noch angegeben, was wir den von SDL benötigen. In unserem Fall einfach nur die Grafikfunktion. Allerdings werden auch Events initialisiert, aber hierzu später.

Wenn es schief ging, wird eine Fehlermeldung herausgegeben. SDL_GetError gibt uns sogar einen genaueren Grund an, warum es nicht ging.

Mit SDL_CreateWindow wird dann das Fenster erzeugt, welches wir hier dann sehen. Der Funktion werden der Titelname, die Position und die Eigenschaft des Fensters übergeben.

Auch hier wird eine Fehlermeldung herausgegeben, wenn das Fenster nicht erzeugt werden konnte.

Reagieren auf eine Eingabe

Na ja, eigentlich kann man dieses Programm nicht wirklich als gut bezeichnen. Ein Fenster wird geöffnet und dann irgendwann wieder geschlossen.

Wir machen es nun ein bisschen spannender und reagieren zumindest mal auf das Schließsymbol.
Dazu müssen wir eine Abfrage erstellen, die dann entsprechend reagieren kann. Statt mit SDL_Delay auf das Ende zu warten, setzen wir hier eine neue Funktion ein, die wir einfach mal Eingabe() nennen. Da es zu fast unendlich vielen Eingaben kommen kann und wir alles irgendwie verarbeiten müssen, machen wir hier noch eine While-Schleife darum:

Unsere Eingabe()-Funktion hat folgendes aussehen:

Zunächst benötigen wir hier eine SDL_Event Variable, die wir event nennen. Dort werden die „Events“ abgelegt, wenn es welche gibt.

In der while-schleife fragen wir mit SDL_PoolEvent die Warteschleife der Events ab und legen das Ereignis nach &event. Über switch(event.type) fragen wir dann dieses Event ab.

Zunächst reagieren wir nur auf „SDL_QUIT„, was das schließen des Fensters bedeutet und beenden das Programm.

Sourcecode: 2.c

Programm sauber beenden

Das Programm, welches bisher geschrieben wurde, ist bisher sehr einfach geschrieben worden. Damit aber ein SDL-Programm sauber läuft, sollten noch ein paar Dinge beachtet werden.

Am Anfang des Programms wird SDL Initialisiert und sperrt einige Ressourcen des Betriebssystems. Wird Das Programm allerdings nicht sauber beendet, wird dem Betriebssystem einige Ressourcen nicht zurückgegeben. Bei den heutigen Rechnern ist das kleine Programm noch kein Problem, aber wenn diese größer werden, kann es irgendwann zu Problemen führen. Deshalb werden wir dieses Programm etwas verändern und die entsprechenden Ressourcen, auch bei einem Fehler, wieder dem System zurückgeben.

Wie gesagt, wird zunächst SDL Initialisiert und anschließend ein Fenster geöffnet. Wenn es nun beim Fenster öffnen zu einem Fehler kommt, müssen wir die Initialisierung wieder rückgängig machen. Dies geschieht ganz einfach mit SDL_Quit(). Also nach dem öffnen des Fensters ändern wir die Fehlerbehandlung:

Unser Loop, also unser Eingabefunktion, hat nun einen gravierenden Fehler. Es ist eine Endlosschleife, wenn es da nicht diesen harten Ausgang hätte…
Aber hier müssen wir auch irgendwie reagieren, wenn das Programm geschlossen wird. Dies sollte im Hauptprogramm „main()“ erfolgen. Dazu schreiben wir unseren Loop um. Allerdings müssten wir hier noch aus der Eingabe-Funktion wissen, ob nun das Programm beendet werden soll. Dazu ändern wir zunächst diese Eingabe-Funktion, mit der Möglichkeit, dass wir Werte daraus zurückgeben:

Zunächst setzen wir die Variable „done“ auf „0“. Diese Zahl halten wir, solange das Programm, oder später eventuell kein Fehler, passierte. Mit return(done) geben wir diesen Code zurück.
Wenn nun das Fenster geschlossen wird, wird done mit 1 belegt und am Ende dann per return(done) zurückgegeben.

In unserem Hauptprogramm fragen wir genau diesen Wert ab:

Auch hier verwenden wir eine Variable „done„. Die Schleife wird sooft wiederholt, wie done = 0 ist. Sobald die Funktion Eingabe eine 1 zurückgibt, wird done mit 1 belegt und die Schleife beendet.
Jetzt können wir dem System nun alles freigeben. dies geschieht mit SDL_DestroyWindow und SDL_Quit.
Unser Programm wird beendet

Sourcecode: 2.5.c

< Übersicht | Bilder anzeigen und speichern >