[Zurück]
Inhaltsverzeichnis
[Weiter]
Verwendung der "Simple DirectMedia Layer"-API
Video
- Video-Modus auswählen und einstellen
Wähle einfach deine bevorzugte Farbtiefe und Auflösung
und stell sie ein!
|
Tip 1:
Die von der Hardware am besten unterstützte Farbtiefe erfährt man
mit der Funktion SDL_GetVideoInfo().
Tip 2:
Eine Liste aller unterstützten Auflösungen bei einer vorgegebenen
Farbtiefe erhält man mit SDL_ListModes().
|
Beispiel:
{ SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if ( screen == NULL ) {
fprintf(stderr, "Ich konnte kein Fenster
mit der Auflösung 640*480 öffnen: %s\n", SDL_GetError());
exit(1);
}
}
|
- Pixel auf den Bildschirm malen
Man malt Pixel auf den Bildschirm, indem man direkt in
den Grafikspeicher schreibt und dann die
Funktion zum Auffrischen des Bildschirms aufruft.
|
Tip:
Wenn man viel Malen muß, ist es am besten, den Bildschirm (falls nötig)
zu schützen ("lock") und eine Liste von Bereichen zu führen,
die nach dem Malen und Freigeben ("unlock") aufgefrischt werden
müssen. |
Beispiel:
Auf einen Bildschirm mit beliebigem Format malen...
#include "SDL_endian.h" /* für einen 24-Bit-Modus unabhängig von der Bytereihenfolge */
void DrawPixel(SDL_Surface *screen, int x, int y,
Uint8 R, Uint8 G,
Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
if ( SDL_MUSTLOCK(screen) ) {
if ( SDL_LockSurface(screen) < 0 ) {
return;
}
}
switch (screen->format->BytesPerPixel) {
case 1: { /* vermutlich 8 Bit */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: { /* vermutlich 15 Bit oder 16 Bit */
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: { /* langsamer 24-Bit-Modus, selten verwendet */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else {
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: { /* vermutlich 32 Bit */
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
if ( SDL_MUSTLOCK(screen) ) {
SDL_UnlockSurface(screen);
}
SDL_UpdateRect(screen, x, y, 1, 1);
}
|
- Bilder laden und anzeigen
SDL stellt eine einzige Bildlade-Routine zur Verfügung:
SDL_LoadBMP(). Im SDL-Bibliotheks-Archiv gibt es eine
Library,
die weitere Formate laden kann.
Mit SDL_BlitSurface() können Bilder in den Grafikspeicher
kopiert werden. SDL_BlitSurface() schneidet automatisch
das zu kopierende Rechteck zurecht, das dann an
SDL_UpdateRects() weitergereicht werden sollte,
um die Anzeige aufzufrischen.
|
Tip 1:
Wenn ein Bild oft angezeigt werden soll, wird die Darstellung deutlich
beschleunigt, wenn man es mit Hilfe von SDL_DisplayFormat() in das
Format des Bildschirms umwandelt.
Tip 2:
Viele Sprites haben einen transparenten Hintergrund. Die Funktion
SDL_SetColorKey() ermöglicht die Berücksichtigung einer "transparenten
Farbe".
|
Beispiel:
void zeigeBMP(char *datei, SDL_Surface *screen, int x, int y)
{
SDL_Surface *bild;
SDL_Rect ziel;
/* lädt die BMP-Datei in ein Surface */
bild = SDL_LoadBMP(datei);
if ( bild == NULL ) {
fprintf(stderr, "'%s' konnte nicht geladen werden: %s\n", datei, SDL_GetError());
return;
}
/* auf den Bildschirm kopieren
die Surfaces sollten hier nicht gelockt sein. */
ziel.x = x;
ziel.y = y;
ziel.w = bild->w;
ziel.h = bild->h;
SDL_BlitSurface(bild, NULL, screen, &ziel);
/* den veränderten Bildschirm-Bereich auffrischen */
SDL_UpdateRects(screen, 1, &ziel);
SDL_FreeSurface(bild);
}
|
[Zurück]
Inhaltsverzeichnis
[Weiter]
|