16.4 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 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.
Tabelle 16.1
Mögliche Angaben zum Initialisieren von SDL mit SDL_init()
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.
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 relativ 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 z. B. 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:
Tabelle 16.2
Flags für das Surface
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 Hardware-Beschleunigung.
|
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 freizugeben, 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 entsteht, 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.
Hinweis 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ückgeben, 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);
16.4.1 Programmbeispiel – SDL initialisieren und Videomodus einstellen
Das folgende Listing verwendet alle bisher besprochenen Funktionen. Der Video-Untermodus von SDL wird erst initialisiert, und anschließend wird versucht, ein Fenster mit dem Modus 640 x 480 und 16 Bit Farbtiefe im Hauptspeicher zu erstellen. Natürlich können Sie hierbei an den Angaben der Parameter experimentieren.
/* sdl1.c */
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd. h.>
int main (void) {
SDL_Surface *screen;
/* SDLs Videosystem initialisieren und auf */
/* Fehler überprüfen */
if (SDL_Init ( SDL_INIT_VIDEO ) != 0) {
printf ("Konnte SDL nicht initialisieren: %s\n",
SDL_GetError ());
return EXIT_FAILURE;
}
/* Wenn die Anwendung beendet wird, */
/* wird die Funktion SDL_Quit() ausgeführt */
atexit (SDL_Quit);
/* Videomodus mit 640 x 480 Pixel, Hi-Color (16 Bit) */
/* einrichten. Oberfläche (Surface) standardmäßig in */
/* den Hauptspeicher (SDL_SWSURFACE) legen */
screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE);
if (screen == NULL) {
printf ("Videomodus konnte nicht eingerichtet werden: "
" %s\n", SDL_GetError ());
return EXIT_FAILURE;
}
/* 4000 ms warten ... */
SDL_Delay (4000);
printf ("Erfolgreich beendet!\n");
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc `sdl-config --libs` `sdl-config --cflags` -o sdl1 sdl1.c
$ ./sdl1
...
Nach dem Starten des Listings erscheint bei erfolgreicher Ausführung für 4 000 Millisekunden ein SDL-Fenster (genauer das Surface), womit/worauf Sie jetzt weitere Aktionen starten könnten – und im Verlauf der Kapitels auch werden.
|