Also zur Überblendung von zwei Bitmaps habe ich folgenden Code gecshrieben:
Delphi-Quellcode:
procedure DrawAlphaBitmap(X,Y: integer; const Dest,Bitmap: TBitmap;
MaxAlpha,Alpha: integer);
var xx,yy : integer;
DestLine, BitLine: PRGB32Array;
begin
Alpha := MaxAlpha-alpha;
bitmap.PixelFormat:=pf32Bit;
dest.PixelFormat:=pf32Bit;
for yy := 0 to Bitmap.Height - 1 do
begin
BitLine := Bitmap.ScanLine[yy];
DestLine := Dest.Scanline[yy+y];
for xx := 0 to Bitmap.Width - 1 do
begin
DestLine[xx+x].r:=round((BitLine[xx].r/MaxAlpha*(MaxAlpha-Alpha))+
(DestLine[xx+x].r/MaxAlpha*Alpha));
DestLine[xx+x].g:=round((BitLine[xx].g/MaxAlpha*(MaxAlpha-Alpha))+
(DestLine[xx+x].g/MaxAlpha*Alpha));
DestLine[xx+x].b:=round((BitLine[xx].b/MaxAlpha*(MaxAlpha-Alpha))+
(DestLine[xx+x].b/MaxAlpha*Alpha));
end;
end;
end;
Allerdings sage ich, dass du mit deinen verschiedenen Images nicht glücklich werden wirst, Images verbrauchen viele Ressourcen und sind für Spiele sowieso ungeeignet. Um ein Spiel zu schreiben (ich hab mich auch schon einmal an einem Jump'n'run-spiel versucht) würde ich dringenst empfehlen, eigene non-Visual Komponenten zu entwickeln, z.b. eine Klasse TSpieler und eine Klasse TGame (eine Klasse TWelt?). Diese haben dann beide funktionen zum zeichnen.
(So habe ich das jedenfalls gemacht)
TSpieler könnte z.b. so aussehen (vereinfacht):
Delphi-Quellcode:
TSpieler = class
private
ImageIdx: integer;
Images: array[0..6{oder mehr?}] of TBitmap;
public
Left, Top: single;
Width, height: single;
procedure Paint(Canvas: TCanvas); //Edit: procedure vergessen^^
end;
In der PaintRoutine wird dann das aktuelle bild gezeichnet:
Canvas.draw(Left,Top,Images[imageidx];
Du musst dann natürlich imageidx alle 150 ms um 1 erhöhen und eine Prüfung einbauen, dass imageidx nicht höher als die anzahl der Bilder wird. Am besten machst du dafür in TSpieler eine Routine, die du z.b. Update nennen kannst, die du dann regelmäßig aufrufst