Login
Immer anmelden
SSL Login

 
Newsletter
Werbung
Shopping
International Shopping
 
 


Yatego Shopping bei über 10000 Händlern und über
3 Mio. Artikel.


Linux

:

Linux-Bücher

Handy
Shop

  und Computer.

Viele Services

:

Apple iPad Reader,


Ratgeber,

 

Techniktops,

 

Yatego Clicks

  & über 3000

Gutscheine.

 
Fr, 2. August 2002, 00:00

Multimedia-Entwicklung mit SDL

Erste Schritte

Natürlich steht vor dem ersten funktionierenden Programm die Installation der SDL. Bei allen gängigen Linuxdistributionen liegen fertige SDL-Pakete (die eigentliche libsdl und normalerweise auch die Standardbibliotheken sdl_image für erweiterte Grafikfunktionen, sdl_ttf für die Darstellung von TrueType-Fonts, sdl_mixer für erweiterte Soundfunktionalität und sdl_net für Netzwerkfunktionen) bei. Zu installieren sind hier neben den Bibliothekspaketen natürlich auch die Developer-Pakete, die die benötigten Headerdateien enthalten.Auch diese sind bei den gängigen Distributionen dabei.

Wer es dennoch selbst übersetzen will, der kann sich die aktuellen Quellen von der offiziellen libSDL-Website (4) ziehen. Configure und Makefiles liegen dem Archiv bei. Unter Windows kann man sich einfach die SDL-Bibliotheken als DLLs und die Header-Files herunterladen und dann wie gewohnt in sein Projekt einbinden.

Für KDevelop-User empfiehlt sich noch, das Mini-HowTo von Sam Hart (5) zu lesen, da es doch einige Tricks und Kniffe zu beachten gibt; speziell wenn man plattformübergreifende Projekte anlegen möchte. Grundsätzlich gilt hier (wie auch bei anderen IDEs mit automake- und autoconf-Unterstützung), dass die Includes sowie die Lib-Pfade für den Linker nicht statisch angegeben werden sollten, sondern über den Aufruf von sdl-config:

  • "sdl-config --cflags" liefert die Include-pfade
  • "sdl-config --libs" zeigt den libSDL-Pfad

Abbildung: Einstellungen für KDevelop-User

Somit werden Makefiles erzeugt, die auch bei einem System funktionieren, auf dem die Verzeichnisstruktur anders ist als bei dem Rechner, auf dem die Applikation ursprünglich übersetzt wurde.

Nachdem nun die Bibliotheken und Includes installiert sind, kommen wir zur ersten Applikation:

#include <stdlib.h>
#include "SDL.h"
int main()
{
 if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
 {
 fprintf(stderr, "SDL konnte nicht initialisiert werden: %s\n",
 SDL_GetError());
 exit(1);
 }
 atexit(SDL_Quit);
}

Hier passiert nun nicht mehr, als dass SDL initialisiert wird und sich das Programm wieder beendet.

Detail:

SDL wird in sechs Funktionsbereiche eingeordnet:

  • SDL_INIT_AUDIO
  • SDL_INIT_VIDEO
  • SDL_INIT_CDROM
  • SDL_INIT_TIMER
  • SDL_INIT_JOYSTICK
  • SDL_INIT_EVENTTHREAD

Die wichtigsten und funktionsreichsten sind natürlich Video und Audio. SDL_INIT_EVERYTHING initialisiert alle sechs Teilbereiche.

Wenn man also in seiner Applikation eine Funktionalität des entsprechenden Bereiches nutzen möchte, dann muss dieser zu Beginn des Programms über SDL_Init() initialisiert werden. SDL_Init() kann mehrere Bereiche übergeben werden, wenn sie mit dem Oder-Operator verknüpft sind, also z.B.: "SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)".

Die Funktion SDL_Quit() sollte immer beim Beenden der Anwendung aufgerufen werden, da sie die zuvor geladenen SDL-Überreste im Speicher aufräumt und diesen wieder frei gibt.

SDL_GetError() ist eine einfache Routine, die Fehlermeldungen als String zurück gibt. Sie sollte immer bei Fehlerausgaben zu Debuggingzwecken mit ausgegeben werden.

Videomodus

Wir haben in unserem kleinen Beispiel bereits die Videosektion initialisiert. Dieser Bibliotheksteil wird beim Schreiben in den Grafikspeicher benötigt. Dies geschieht zum Beispiel, wenn man direkt einen Pixel auf den Bildschirm zeichnen möchte oder über entsprechende Funktionen ein Bild laden will. Bevor wir dies jedoch tun können, müssen wir nach dem Initialisieren der SDL noch den Videomodus, also die Auflösung und die Farbtiefe des Ausgabebildschirms, einstellen.

SDL_GetVideoInfo() gibt die am besten unterstützte Farbtiefe zurück. SDL_ListModes() zeigt alle unterstützten Auflösungen bei einer entsprechenden Farbtiefe.

Wir nutzen aber bei unseren Beispielen einfach immer 800x600 Pixel bei 16 Bit Farbtiefe (also 64K Farben).

Der entsprechende Codeteil dafür sieht wie folgt aus:

&#91;...&#93;
 SDL_Surface *display;
 display = SDL_SetVideoMode( 800, 600, 16, SDL_SWSURFACE );
 if ( display == NULL )
 {
 fprintf(stderr, "Konnte kein Fenster 800x600px oeffnen: %s\n",
 SDL_GetError());
 exit(1);
 }
&#91;...&#93;

Detail:

Gleich die erste Zeile, das Anlegen eines SDL_Surface, gehört zum elementaren Grundverständnis des Grafikbereichs der libSDL. Bei SDL wird mit sogenannten "Surfaces" gearbeitet. Ein Surface ist eigentlich nur ein reservierter Speicherbereich, dem Bildschirmeigenschaften wie Breite, Höhe, Farbtiefe, etc. zugewiesen sind.

Man muss sich das so vorstellen: man erstellt ein Basis-Surface, in unserem Fall mit dem Namen "display", und initialisiert dafür einen Videomode mit SetVideoMode(). "display" wird somit zu unserem Bildschirm; nach offizieller SDL-Definition auch das "display-surface" genannt. Die Parameter sind:

SDL_SetVideoMode( Screen-Weite, Screen-Höhe, Farbtiefe, Flags)

Screen-Höhe und -Weite versteht sich von selbst und wird auch beachtet, solange nicht als Flag der Fullscreen-Mode erzwungen wird. Die Farbtiefe sollte mit Sorgfalt gewählt werden, da nicht jedes System mit jeder Farbtiefe umgehen kann. SDL versucht zwar, nicht vorhandene Farbtiefen auf dem System zu emulieren, doch schlägt auch dies fehl, so bricht das Programm mit einer Fehlermeldung ab.

Durch den vierten Parameter, die Video-Flags, kann man die eigentlichen Videoeigenschaften beeinflussen. Die Flags sind wie folgt definiert:

  • SDL_SWSURFACE - Das Surface wird im Hauptspeicher abgelegt (default)
  • SDL_HWSURFACE - Das Surface wird im Grafikspeicher abgelegt
  • SDL_ASYNCBLIT - Surface benutzt asynchrone Blits, wenn möglich
  • SDL_ANYFORMAT - Erlaubt jedes Pixel-Format (nur beim display-surface)
  • SDL_HWPALETTE - Surface nutzt exklusive Farbpalette
  • SDL_DOUBLEBUF - Surface ist "double buffered" (nur display-surface)
  • SDL_FULLSCREEN - Surface im Full-Screen-Mode initialisieren (nur display-surface)
  • SDL_OPENGL - Surface nutzt OpenGL (nur display-surface)
  • SDL_OPENGLBLIT - Surface unterstützt OpenGL blitting (nur display-surface)
  • SDL_RESIZABLE - Surfacefenster ist veränderbar (nur display-Surface)
  • SDL_HWACCEL- Surface blit nutzt Hardwarebeschleunigung
  • SDL_SRCCOLORKEY - Surface nutzt colorkey blitting
  • SDL_RLEACCEL - Colorkey blitting ist durch RLE beschleunigt
  • SDL_SRCALPHA - Surface blit nutzt alpha blending
  • SDL_PREALLOC - Surface nutzt vorher allokierten Speicher

Wie man zweifelsfrei erkennen kann, hat man bei der Videoinitialisierung viele Möglichkeiten, die man, wie auch beim SDL_Init() durch ein Oder getrennt, kombinieren kann.

Für uns ist am Anfang nur wichtig zu wissen, dass wir durch SDL_SWSURFACE und SDL_HWSURFACE den Speicherbereich der Surfaces beeinflussen und durch SDL_FULLSCREEN einen Vollbildschirm erzwingen können.

Man hat nun das display-surface, also im Prinzip den Bildschirm. Jetzt erstellt man weiter solche Speicherbereiche mit SDL_Surface() für z.B. ein Bild. Dieses Bild-Surface kann man manipulieren und verändern.

Ist die Arbeit getan, kann man einen Bereich oder auch die gesamte Bildfläche auf den Display-Surface kopieren. Dieser Vorgang wird Blit genannt. Durch ein einfaches Refresh des entsprechend geänderten Bereichs (oder alles) des Bildschirmdisplays wird dann eine Anzeige erreicht. Dazu aber im nächsten Kapitel etwas mehr.

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Forum
Neue Nachrichten