SDL: Colorkeys
Theorie:
BearbeitenJetzt 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:
BearbeitenIm 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
BearbeitenDabei 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.