Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 16 SDL
  gp 16.1 Was ist und kann SDL?
  gp 16.2 SDL installieren
  gp 16.3 SDL-Anwendungen erstellen
  gp 16.4 SDL initialisieren und Videomodus einstellen
    gp 16.4.1 Programmbeispiel – SDL initialisieren und Videomodus einstellen
  gp 16.5 Direkt auf den Bildschirm zeichnen
    gp 16.5.1 Programmbeispiel – direkt auf den Bildschirm zeichnen
  gp 16.6 Bitmap laden und anzeigen
    gp 16.6.1 Programmbeispiel – Bitmap laden und anzeigen
  gp 16.7 Ein anderes Grafikformat laden und anzeigen
  gp 16.8 Der rechteckige Bildbereich von SDL
  gp 16.9 Farbenschlüssel, Transparenz und Alpha-Blending
    gp 16.9.1 Alpha-Blending
  gp 16.10 Animation
    gp 16.10.1 Programmbeispiel – Animation
  gp 16.11 Eingabe- und Ereignisverarbeitung
    gp 16.11.1 SDL-Event-Struktur
    gp 16.11.2 Maus-Events
    gp 16.11.3 Programmbeispiel – Maus-Event
    gp 16.11.4 Tastatur-Events
    gp 16.11.5 Programmbeispiel – Tastatur-Events
    gp 16.11.6 Joystick-Events
    gp 16.11.7 Programmbeispiel – Joystick-Events
    gp 16.11.8 Weitere Events
  gp 16.12 Audio
    gp 16.12.1 Programmbeispiel – Audio
  gp 16.13 Ausblick


Rheinwerk Computing

16.4 SDL initialisieren und Videomodus einstellen  downtop

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

Rheinwerk Computing

16.4.1 Programmbeispiel – SDL initialisieren und Videomodus einstelletoptop

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.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern