Theorie:

Bearbeiten

Jetzt können wir schon mit SDL_Rects die Position von einem Bild auf dem Bildschirm bestimmen, wissen was Double Buffering bedeutet und können bestimmte Bereiche des Bildschirms oder gar eines anderen Surfaces mit einer beliebigen Farbe füllen. Doch das alles reicht noch nicht aus um Tux sein Rot wegzunehmen, dazu brauchen wir Colorkeys. Mit Colorkeys kann man eine bestimmte Farbe setzen, die auf einem Surface Transparent sein soll.

SDL_SetColorKey heißt die Funktion dafür. Sie erwartet als ersten Parameter die Oberfläche, auf der eine bestimmte Farbe durchsichtig gemacht werden soll, als zweiten einen Flag und als dritten einen Farbwert, der wie so oft per SDL_MapRGB erzeugt wird. Als Flag nehmen wir SDL_SRCCOLORKEY.

Hier ein Beispiel des Nutzens der SDL_SetColorKey Funktion (oberhalb der SDL_BlitSurface-Funktion eintragen!!):

 SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 0)); // Rot wird Transparent

Tux in blauer Szene:

Bearbeiten

Im Beispiel wird Tux vor einem blauen Hintergrund gezeigt. Mit der SDL_SetColorKey Funktion wird der rote Hintergrund unseres Bildes transparent gemacht:

Quellcode

Bearbeiten
 #include <stdlib.h>
 #include <SDL/SDL.h>
 int main(int argc, char *argv[])
 {
     SDL_Surface *screen, *image;
     SDL_Rect dst;
     SDL_Event event;
     int done = 0;
     if (SDL_Init(SDL_INIT_VIDEO) == -1) {
         printf("Can't init SDL:  %s\n", SDL_GetError());
         exit(1);
     }
     atexit(SDL_Quit); 
     screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
     if (screen == NULL) {
         printf("Can't set video mode: %s\n", SDL_GetError());
         exit(1);
     }
     SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 255));
     image = SDL_LoadBMP("tux.bmp");
     if (image == NULL) {
         printf("Can't load image of tux: %s\n", SDL_GetError());
         exit(1);
     }
     dst.x = 200;
     dst.y = 200;
     dst.w = image->w;
     dst.h = image->h;
     SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 255, 0, 0));
     SDL_BlitSurface(image, NULL, screen, &dst);
     SDL_FreeSurface(image);
     SDL_Flip(screen);
     while (!done) {
         while (SDL_PollEvent(&event)) {
             switch (event.type) {
             case SDL_QUIT:
                 done = 1;
                 break;
             }
         }
     }
     return 0;
 }

Erläuterungen

Bearbeiten

Dabei dürfte hier außer der Sachen für das Double Buffering nichts Neues dabei sein. Der Flag SDL_DOUBLEBUF bei der SDL_SetVideoMode-Funktion sorgt dafür, dass Double Buffering genutzt wird und der Befehl SDL_Flip tauscht die angezeigte Oberfläche aus. So werden also erst alle Zeichenoperationen ausgeführt, bevor das Gezeichnete auf den Bildschirm per SDL_Flip gebracht wird. Das wars eigentlich auch schon.