Sonstige

C und die Simple Directmedia Library (SDL) (Sonstige Tutorial)

Tutorial erstellt von Andreas W., letzte Änderung am 11.08.2009

Hallo!

Dies ist eine kurze, aber sichrlich interessante Einführung in den Umgang mit der Simple Directmedia Library (SDL), welche verschiedene Funktionen zur Verfügung stellt, um grafische Oberflächen in 2D und 3D (via OpenGL) zu erzeugen, Tastatur-, Maus- und sogar Joystick-Eingaben zu verarbeiten und zu guter letzt die Ausgabe von Sound zu steuern.

Ich werde in diesem Tutorial nicht auf die Installation der verschiedenen SDL Bibliotheken eingehen, aber ich werde einen kurzen Überblick über den grundlegenden Umgang mit einigen dieser interessanten und nützlichen Bibliotheken vorführen. Insbesondere werde ich auf die SDL Library SDL.h eingehen.

Wie üblich werden wir mit einem einfachen, aber besonders lustigen "Hello World" beginnen, dass wir in ANSI C (nach dem 1989 festgelegten Standard) schreiben werden. Grundlegende Kenntnisse in C werden vorausgesetzt. Doch genug des Geredes, bitte betrachtet doch mal die folgenden Zeilen Code:

Code:

/* include standard libs */
#include <stdlib.h>
#include <stdio.h>

/* include needed libs */
#include <SDL.h>

/* the main function */
int main(int argc, char *argv[])
{
    /* declare screen */
    SDL_Surface *screen;

    /* initialize the SDL video system */
    if( SDL_Init(SDL_INIT_VIDEO) == -1 )
    {
        /* an error occurred */
        fprintf(stderr, "Cannot set video mode!");
        exit(1);
    }

    atexit(SDL_Quit);

    /* create a window */
    if( (screen = SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE)) == NULL )
    {
        /* an error occurred */
        fprintf(stderr, "Cannot open a window!");
        exit(1);
    }

    /* set window and icon title */
    SDL_WM_SetCaption("SDL Hello World", "SDL Hello World");

    /* wait a moment */
    SDL_Delay(3000);

    /* cleanup SDL */
    SDL_Quit();

    return 0;
}


Eigentlich denke ich, dass diese paar Zeilen Code selbsterklärend sind, aber ich will noch etwas darauf eingehen.

Das Einbinden der benötigten Bibliotheken bildet den Anfang unseres kleinen Programms. In unserem Fall sind dies die Standardbibliothek und die Bibliothek für die Ein- und Ausgabe von Text auf der Standard-Ausgabe (in unserem Fall die Shell oder DOS).

Nach dem Einbinden deklarieren wir die main()-Funktion, die Basis jedes C-Programms ist und beim Ausführen des Programms automatisch ausgeführt wird. Die Parameter der main() sind zwar eigentlich uninteressant, aber zur Erklärung sei gesagt, dass der erste Parameter die Anzahl der auf der Konsole übergebenen Parameter und der Parameter die Parameter selbst enthält.

Das erste, was wir in unserer Funktion tun ist ein SDL_Surface deklarieren, das unseren Bildschirm repräsentiert.

Die Funktion SDL_Init() initialisiert das Anzeige-System von SDL. In dem Fall, dass dieser Aufruf -1 als Rückgabewert liefert, ist ein Fehler aufgetreten und die Initialisierung ist fehlgeschlagen, sodass wir das Programm mit dem Aufruf von exit() verlassen können. Der Parameter von exit() wird dabei als Medium verwendet, um dem System, auf dem das Programm läuft mitzuteilen, dass wir das Programm mit einem Fehler beendet haben. Bevor wir jedoch das Programm verlassen geben wir eine Fehlermeldung auf dem Standardausgabewerk (in unserem Fall der Linux-Shell oder der DOS-Umgebung) aus. Das darauf folgende atexit() wird dazu verwendet, die Funktion SDL_Quit() beim Verlassen des Programms mit exit() auszuführen.

Das nun folgende SDL_SetVideoMode() erwartet vier Parameter (Breite und Höhe des zu erstellenden Fensters, Bytes per Pixel, sowie verschiedene Flags). Die ersten Parameter sollten also klar sein und der dritte Parameter definiert einfach nur wieviel Speicherplatz benötigt wird um die Informationen eines einzelnen Pixels zu speichern. Dies kann zum Beispiel aufgrund der Farbtiefe variieren. Durch setzen des dritten Parameters auf Null wird der Default-Wert für die Größe des reservierten Speichers verwendet, der sich allerdings von System zu System unterscheiden kann. Der letzte Parameter ist besonders interessant. In unserem Fall teilt er dem Programm mit, dass wir gerne den Video-Speicher anstatt des Software-Speichers verwenden möchten. Dies sorgt dafür, dass der Speicher unserer Grafikkarte verwendet wird. Zusätzlich können zu diesem Flag auch weitere durch "Oder" getrennte Flags in diesem Parameter übertragen werden, wie zum Beispiel das SDL_FULLSTREEN Flag, dass genutzt wird, um ein Fenster im Vollbild_Modus zu öffnen. Versucht das Fenster im Vollbild-Modus zu öffnen, indem ihr  "SDL_HWPALETTE" durch "SDL_HWPALETTE | SDL_FULLSTR" im Quellcode ersetzt.

Um unser erstelltes Fenster noch etwas zu dekorieren, rufen wir die Funktion
SDL_WM_SetCaption() und deklarieren so einen Titel, der im oberen Rahmen des Fensters angezeigt werden soll. Dabei ist der erste Parameter der Funktion der Titel des Fensters und der zweite, der hier eigentlich nicht benötigt wird, der Titel des Icons, das ebenfalls zur Dekoration des Fensters hinzugefügt werden kann.

Zum Schluss warten wir einige Millisekunden (in unserem Fall 3000) bevor wir unser Fenster schließen und SDL schließen.

Um dieses kleine Programm ausführen zu können, speichert den Quellcode in einer Datei Namens hello.c und kompiliert es (unter einem UNIX Betriebssystem) unter Benutzung des gcc Compilers (GNU Compiler Collection) wie folgt.

Code:
gcc hello.c `sdl-config --cflags --libs` -lSDL -o hello


Nachdem ihr dies getan habt könnt ihr das kompilierte Programm via

Code:
./hello


ausführen.

Ich hoffe, euch hat mein kurzer Exkurs in die Programmierung von grafischen Anwendungen mit C mit Hilfe der SDL Bibliothek gefallen und euch zu weiteren Spielereien mit der Simple Directmedia Library angeregt.

MfG, Andy

Eine kurze Einführung in den Umgang mit der Simple Directmedia Library (SDL), die es ermöglichen grafische Oberflächen, sowie viele andere Multimedia-Features mittels C in seinen Projekten einzubinden.


>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!

Impressum / Datenschutzerklärung          © der-Webdesigner.net 2002 - 2011           top ▲