http://www.pronix.de -> Bücher -> Bücher aus meiner Feder -> Linux-Unix-Programmierung -> Extra Kapitel: SDL -> SDL initialisieren und Videomodus einstellen

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.
Tabelle 15.1: Mögliche Angaben zum Initialisieren von SDL mit SDL_init()

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.

Hinweis

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
Tabelle 15.2: Flags für das Surface

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);