SDL initialisieren und Videomodus einstellen
Als erstes Beispiel soll ein einfaches SDL-Fenster erstellt werden. Bevor Sie ein solches erstellen können, müssen Sie SDL erst mal initialisieren. Das Initialisieren erledigen Sie mit der Funktion SDL_init():int SDL_Init(Uint32 flags);
Diese Funktion müssen Sie immer vor allen anderen SDL-Funktionen aufrufen. Mit dem Parameter flags geben Sie an, welchen Teil von SDL Sie initialisieren wollen. Hierfür können folgende Flags als Parameter angegeben werden. Bei mehreren Angaben können Sie mit einem bitweisen ODER-Operator auch mehrere Flags verknüpfen.
| Flag | Bedeutung |
| SDL_INIT_TIMER | Initialisiert das Timer-Untersystem |
| SDL_INIT_AUDIO | Initialisiert das Audio-Untersystem |
| SDL_INIT_VIDEO | Initialisiert das Video-Untersystem |
| SDL_INIT_CDROM | Initialisiert das CD-Rom-Untersystem |
| SDL_INIT_JOYSTICK | Initialisiert das Joystick-Untersystem |
| SDL_INIT_EVERYTHING | Initialisiert alle eben aufgezählten Untersysteme auf einmal |
| SDL_INIT_NOPARACHUTE | Verhindert, dass SDL fatale Signale abfängt. |
Die Funktion SDL_Init() gibt bei Erfolg 0, ansonsten bei einem Fehler -1 zurück. Mit der Funktion SDL_Init() haben Sie nun einen Teil initialisiert, den Sie zum Schreiben in den Grafikspeicher benötigen. Bevor Sie aber irgendetwas grafisches machen können, müssen Sie zuvor noch den Videomodus einstellen. Diesen Modus stellen Sie mit folgender Funktion her:
SDL_Surface *SDL_SetVideoMode( int width, int height,
int bpp, Uint32 flags );
Damit stellen Sie den Videomodus auf die Auflösung width * height und die Bits pro Pixel (bpp) ein. Bits pro Pixel ist den meisten Lesern wahrscheinlich als Farbtiefe geläufiger. Wird hierfür der Wert 0 verwendet, werden die aktuellen Einstellungen des X-Servers verwendet.
Welche Auflösungen bei einer vorgegebenen Farbtiefe unterstützt werden, können Sie mit der Funktion SDL_ListModes() erfahren. Welche davon die beste auf Ihrem Rechner ist, können Sie mit der Funktion SDL_GetVideoInfo() ermitteln. Mit SDL_GetVideoInfo() lassen sich außerdem noch mehr Informationen zur Hardware ermitteln. Hierzu wird auf entsprechende Manual-Pages bzw. Dokumentationen hingewiesen. In den Beispielen wird meistens eine realtiv niedrige Auflösung (640 x 480 oder 800 x 600) und Farbtiefe (16 Bit) verwendet, was heute wohl keinen Rechner mehr in Schrecken versetzen dürfte.
Bei Erfolg liefert die Funktion SDL_SetVideoMode() einen Zeiger auf das Framebuffer-Surface oder bei einem Fehler NULL zurück. Wenn der Begriff Surfaces in unsere Sprache übersetzt wird, ist es wohl einfacher einzusehen, worum es sich handelt. Surfaces sind Oberflächen, die Sie benötigen, um überhaupt etwas zeichnen zu können. Darin oder darauf sind alle Informationen wie bspw. die Höhe, Breite, Farbtiefe usw. angegeben. Wenn Sie mehr dazu erfahren wollen, sollten Sie einen Blick auf die Struktur SDL_Surface (man SDL_Surface) werfen.
Mit dem vierten Parameter flags geben Sie an, wie das Surface (besser die Oberfläche) gehandhabt werden soll. Mehrere Flags werden nach Bedarf mit dem bitweisen ODER Verknüpft. Auf einige dieser flags wird im Verlaufe des Buchs noch genauer eingegangen. Folgende Flags sind hierfür definiert:
| Flag | Bedeutung |
| SDL_SWSURFACE | Surface in den Hauptspeicher ablegen (Standardeinstellung) |
| SDL_HWSURFACE | Surface in den Grafikspeicher legen |
| SDL_ASYNCBLIT | Surface benutzt, wenn möglich, asynchrone Blits |
| SDL_ANYFORMAT | Erlaubt jedes Pixel-Format (nur beim Standard-Surface) |
| SDL_HWPALETTE | Surface verwendet exklusive Farbpalette |
| SDL_DOUBLEBUF | Surface verwendet doppelte Pufferung (nur Standard-Surface) |
| SDL_FULLSCREEN | Surface im Full-Screen-Mode initialisieren (Vollbildschirmmodus) (nur Standard-Surface) |
| SDL_OPENGL | Surface verwendet OpenGL (nur Standard-Surface) |
| SDL_OPENGLBLIT | Surface unterstützt OpenGL blitting (nur Standard-Surface) |
| SDL_RESIZABLE | Größe/Auflösung – Surface-Fenster kann verändert werden (nur Standard-Surface) |
| SDL_HWACCEL | Surface blit verwendet Hardwarebeschleunigung |
| SDL_SRCCOLORKEY | Surface verwendet colorkey blitting |
| SDL_RLEACCEL | Colorkey blitting wird durch RLE beschleunigt |
| SDL_SRCALPHA | Surface blit verwendet Alpha-Blending |
| SDL_PREALLOC | Surface verwendet zuvor alloziierten Speicher |
Um sämtliche Aufräumarbeiten zu machen und Speicher frei zugeben, ruft man bei Beendigung der Anwendung immer die Funktion SDL_Quit() auf.
void SDL_Quit(void);
Mit SDL_Quit() werden auch alle Ressourcen des SDL-Untersystems (Flags, die bei der Funktion SDL_Init() angegeben wurden) freigegeben. Da bei intensiveren Anwendungen ziemlicher Speicherbedarf ensteht, wird empfohlen, diese Funktion immer aufzurufen. Damit dies auch realisiert wird und man nicht für jede SDL-Routine extra eine Funktion aufrufen muss, kann man die ANSI C Funktion atexit() dazu verwenden. Damit ist garantiert, dass noch vor Beendigung der Anwendung sämtliche Reinigungsarbeiten mit SDL_Quit() ausgeführt werden.
Wenn Sie nur ein einzelnes Untersystem von SDL beenden wollen, können Sie auch die Funktion
void SDL_QuitSubSystem();
mit der Angabe des entsprechenden Untersystems (siehe SDL_Init()) verwenden.
Bei fast allen Funktionen, die einen Fehler zurückgegeben, können Sie die Funktion SDL_GetError() verwenden. Ähnlich wie perror() erhalten Sie einen nullterminierten String zurück, der Informationen über das Auftreten des letzten Fehlers enthält. Wenn Funktionen wie SDL_SetVideoMode() fehlschlagen, ist eine solche Informationen recht hilfreich - gerade für den Endanwender. Die Syntax zu SDL_GetError() lautet:
char *SDL_GetError(void);
