[SDL] Halbtransparentes Surface + SetColorKey
-
Ich hätte da mal ne kleine Frage zu SDL und zwar:
Wenn ich ein Surface erstelle, mit rot fülle und auf halbtransparent stelle, dann ein zweites Surface mit der Farbe grün erstelle und das rote halbtransparente Surface auf das Grüne kopiere, bekomme ich ja eine neue Farbe (bei mir wäre das 127 127 0). Wenn ich nun eben diese Farbe (die ich zur Laufzeit durch Surface->pixels herausfinde) mit SDL_SetColorKey ausblenden will, wird leider die Farbe nicht ausgeblendet. SDL_SetColorKey scheint einfach nichts zu tun. Wenn ich allerdings das halbtransparente, rote Surface nicht über das grüne Surface kopiere und dann SDL_SetColorKey benutze, funktioniert alles wie es soll, also die grüne Farbe wird unsichtbar (ist ja auch klar ..).
Ich habe hier mal den Src:
void test_color(SDL_Surface *surface, int x, int y) { SDL_Surface *surface_green, *surface_red_trans; SDL_Rect src, dest; /* Erstellen der temporären Surfaces */ /* Ein Surface wird mit rot gefüllt, halb transparent */ surface_red_trans = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, screen->format->BitsPerPixel, 0, 0, 0, 0); SDL_FillRect(surface_red_trans, 0, SDL_MapRGB(surface_red_trans->format, 255, 0, 0)); SDL_SetAlpha(surface_red_trans, SDL_SRCALPHA, 128); /* surface_green wird mit Farbe grün gefüllt */ surface_green = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, screen->format->BitsPerPixel, 0, 0, 0, 0); SDL_FillRect(surface_green, 0, SDL_MapRGB(surface_green->format, 0, 255, 0)); /* Nun kopieren wir surface_red_trans in surface_green */ dest.x = src.x = 0; dest.y = src.y = 0; dest.h = src.h = 50; dest.w = src.w = 50; SDL_BlitSurface(surface_red_trans, &src, surface_green, &dest); /* Es entsteht im surface_green eine Farbmischung aus grün + rot */ /* Nun soll die neu entstandene Farbe (grün + rot) unsichtbar gemacht werden */ /* Einfach die Farbe des ersten Pixels nehmen, alle anderen Pixel haben eh die selbe Farbe */ SDL_Color color = GetPixel(surface_green, 0, 0); /* Ausgabe ist: 127 127 0 */ printf("%d %d %d\n", color.r, color.g, color.b); /* Ausblenden der Farbe (grün + rot) Jetzt sollte surface_green ganz schwarz sein */ SDL_SetColorKey(surface_green, SDL_SRCCOLORKEY, SDL_MapRGB(surface_green->format, color.r, color.g, color.b)); /* Kopieren von surface_green auf das screen surface */ dest.x = x; dest.y = y; SDL_BlitSurface(surface_green, &src, surface, &dest); /* Theoretisch müsste das grün+rote Rechteck nicht zu sehen sein, ist es aber ... */ SDL_FreeSurface(surface_green); SDL_FreeSurface(surface_red_trans); } /** * Wenn die erste Blitfunktion auskommentiert wird (kopieren von surface_red_trans auf surface_green), * also nur das grün von surface_green in surface_green ist, dann wird bei SDL_SetColorKey * die Farbe ausgeblendet und es ist kein Rechteck zu sehen. Leider ist das nicht so, * wenn man das rote surface ins grüne kopiert, aber warum ... */
Ich weiß, es scheint unsinnig, sowas zu machen, wenn am Ende eh wieder alles schwarz ist, aber es hat schon einen Sinn. Allerdings habe ich einen Teil des Src rausgenommen und nur jetzt mal zum testen nen kleines Programm gemacht.
Ich habe hier auch mal die Dateien hochgeladen: http://feigling.php-4.info/color_test/
Das Einzige, was ich wissen möchte ist, warum die neue Farbe, die gemischt wurde nicht von SDL_SetColorKey akzeptiert wird.
Vielleicht übersehe ich ja etwas ganz triviales.
Schonmal vielen Dank im Vorraus.
-
Hat sich erledigt. Das lag an der Desktopfarbtiefe. Ich muss einfach nur bei SDL_SetVideoMode 16 Bit erzwingen.