[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]