Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Sprites mit der GDI
von Plapperkatze am 3.Februar 2006 um 16:03
zurück zur Kategorie "Tutorials"

Hi ihr,
Sprites gab es schon am C64, und mit der Windows GDI ist das natürlich auch machbar. Wir werden ein teiltransparentes Bitmap in einem Fenster "herumfliegen" lassen.



Transparenz

Aus dem Originalbild wird eine "Maske" erstellt, was nichts anderes ist als ein Schwarzweiß-Bitmap (1 pixel=1 bit) derselben Größe.
hBmpMask = CreateBitmap(breite,hoehe,1,1,NULL);
Als Farbe, die transparent dargestellt werden soll, wird hier Weiß gewählt (hdcBitmap ist das Original):
SetBkColor(hdcBitmap,RGB(255,255,255));
Wenn man nun das Original in das Masken-Bitmap blittet
BitBlt(hdcMask,0,0,76,76,hdcBitmap,0,0,SRCCOPY);
erhält man folgendes:



Also alles, was im Original nicht weiß war, ist in der Maske schwarz, ein Schattenriss sozusagen. Diese Maske blitten wir jetzt auf unser Original zurück:
SetBkColor(hdcBitmap,RGB(0,0,0));
SetTextColor(hdcBitmap,RGB(255,255,255));
BitBlt(hdcBitmap,0,0,76,76,hdcMask,0,0,SRCAND);
Dabei kommt folgendes heraus:



Wenn wir die Maske jetzt auf den Bildschirm bringen und mit
BitBlt(hdcTarget,x,y,76,76,hdcBitmap,0,0,SRCAND);
blitten (hdcTarget ist unser Zielfenster, hdcBitmap die Maske), werden die Pixel mit Boolean AND verknüpft. Der Schattenriss des Bitmaps wird also schwarz, der Rest bleibt unverändert.



Nun blitten wir das bearbeitete Bitmap mit SRCPAINT an dieselbe Position:
BitBlt(hdcTarget,x,y,76,76,hdcBitmap,0,0,SRCPAINT);
Hier das Ergebnis:



Damit haben wir schon beinahe, was wir wollten. Das Bitmap wird teiltransparent gezeichnet, manche Bereiche sind also durchsichtig. Nur wenn man es bewegt.. nun, dann wird es jedesmal neu in das Fenster gezeichnet, und lässt dabei die vorherigen Blits unverändert bestehen. Um das zu verhindern:

Backbuffering (oder wie sagt man dazu?)

Der Bereich des Fensters, auf den das Sprite gezeichnet werden soll, wird vorher gesichert (also ein Bitmap in der Größe des Sprites) und später zurückgeblittet.
hBmpOld = CreateBitmap(76,76,bm.bmPlanes,
bm.bmBitsPixel,NULL);

BitBlt(hdcTarget,x,y,76,76,hdcBitmap,0,0,SRCCOPY); // backbuffer in fenster
x+=xdir; // neue koordinaten
y+=ydir;
...
BitBlt(hdcBitmap,0,0,76,76,hdcTarget,x,y,SRCCOPY); // neuen bereich in den backbuffer

Hier ist der Sourcecode und das Bitmap:
http://katze.dead-men.de/upload/10_sprite.rar

grüsse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215314 Besucher seit dem 23.01.2012 Login