www.codeworx.org/directx_tuts/Einführung in DirectDraw: Teil 7, Color Keying

Einführung in DirectDraw: Teil 7, Color Keying
Datum: 4.7.01
Autor: Tim-Oliver Husser

Themen für Teil 7 dieses Tutorials:
Das Problem
Die Funktion
Der Aufruf

Das Problem
So, fangen wir mal wieder an! :) Also: Suchen Sie mal in dem Code vom letzten Tut die Zeile:

SetRect(&rectbitmap, -50, 0, 150, 150);

Und ersetzen sie diese mal wieder, z.B. durch:

SetRect(&rectbitmap, 100, 100, 320, 250);

Und? Was ist? Das eine Bild verdeckt das andere. Wäre es nun nicht schön, wenn man bei dem obenliegenden Bild z.B. die Farbe schwarz transparent machen könnte, so daß man das Bild darunter noch erkennt? Hier kommt das Color Keying ins Spiel!

Die Funktion
Für das ganze schreiben wir uns jetzt mal schnell ne kleine Hilfsfunktion:

void AddColorKey (LPDIRECTDRAWSURFACE7 surface, DWORD Low, DWORD    High)
{
   DDCOLORKEY key;
   ZeroMemory(&key, sizeof(key));
   key.dwColorSpaceLowValue = Low;
   key.dwColorSpaceHighValue = High;
   surface->SetColorKey (DDCKEY_SRCBLT, &key);
}

Sie ist wirklich genau so simpel, wie sie aussieht! ;)
Wir übergeben der Funktion einen Pointer auf die Surface, die einen Color Key erhalten soll und die Grenzwerte für den Color Key.
Nun speichern wir diese Grenzwerte in einer Struktur vom Typ DDCOLORKEY (die wir vorher sauber auf 0 setzen). Dann benutzen wir die Methode SetColorKey der Surface und übergeben ihr den Flag DDCKEY_SRCBLT, der angibt, daß es ein "Source Key" ist (also die Surface selbst transparent sein soll, wenn man sie woanders hin blittet), und den Color Key selbst. Fertig! ;)

Der Aufruf
Nachdem die Bitmap geladen ist, müssen wir jetzt also nur noch den Color Key anfügen. Wenn wir die Farbe schwarz transparent machen wollen, sieht das so aus (nach der DDLoadBitmap-Anweisung):

AddColorKey(lpddsBitmap, 0, 0);

Jetzt müssen wir diese mit einem Color Key ausgestattete Surface nur noch richtig einsetzen. Wir blitten bekanntermaßen beide Bitmaps mit der Anweisung:

lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_WAIT, NULL);

Bei dem zweiten Blit müssen wir der Blt-Funktion jetzt nur noch mitteilen, daß sie da den Color Key verwenden soll. Das tun wir folgendermaßen:

lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_WAIT | DDBLT_KEYSRC,    NULL);

Voila! Fertig ist unser transparentes Bitmap!


Das umstrukturierte Projekt können Sie hier herunterladen.