http://www.pronix.de -> Bücher -> Bücher aus meiner Feder -> Linux-Unix-Programmierung -> Extra Kapitel: SDL -> Farbenschlüssel, Transparenz und Alpha-Blending

Farbenschlüssel, Transparenz und Alpha-Blending

Wenn Sie eine Bitmap-Grafik (ein Ball z. B.) mit einem festen Hintergrund haben (bspw. schwarz) und platzieren diese Grafik jetzt in einem Surface, dessen Hintergrund blau ist, sieht dies ein wenig seltsam aus. SDL bietet Ihnen hierzu eine Möglichkeit, dass die eigentliche Grafik ohne den Hintergrund dargestellt wird. Dies wird mit einem Farbenschlüssel-Blit erledigt. Des Weiteren bietet SDL noch eine Erweiterung dieser Technik mit RLE (Run-Length-Encoding) an - was eine erhebliche Beschleunigung des Zeichnens bewirkt. RLE ist allerdings leider (noch) nur für Bitmaps gedacht.

Ein Farbschlüssel ist ein einzelner Pixel-Wert, welchen Sie als Transparent deklarieren können. Wenn Sie also einen Ball mit schwarzem Hintergrund haben und diesen nun auf einen weißen Hintergrund darstellen wollen, müssen Sie den Farbschlüssel für Schwarz ermitteln. Einen solchen 32 Bit-Farbwert können Sie einfach mit der Funktion SDL_MapRGB() festlegen (die Funktion haben Sie schon einmal verwendet, als es darum ging, einen Pixel auszugeben). Im Falle einer schwarzen Farbe sieht dies dann so aus:

Uint32 colorkey;
...
colorkey = SDL_MapRGB(bild->format, 0, 0, 0);


Nachdem Sie den 32 Bit-Farbwert ermittelt haben, können Sie jetzt mit der Funktion SDL_SetColorKey() den Farbschlüssel festlegen.

int SDL_SetColorKey( SDL_Surface *surface,
                     Uint32 flag, Uint32 key );


Damit setzen Sie den Farbschlüssel key für das SDL-Surface surface. Für die Angabe des Flags können Sie SDL_SRCCOLORKEY verwenden, womit das Farbschlüssel-Blitting für das Surface eingeschalten wird. Die RLE-Beschleunigung können Sie zusätzlich mit dem Flag SDL_RLEACCEL und das Flag SDL_SRCCOLORKEY mit dem bitweisen ODER verknüpfen. Nach diesem Vorgang wird bspw. beim nächsten Funktionsaufruf von SDL_BlitSurface() jeder Pixel, der als Farbschlüssel deklariert wurde, nicht in das Ziel-Surface kopiert. Somit würde in diesem Fall der Ball ohne den schwarzen Hintergrund als transparenter Ball gezeichnet.