Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 19:54
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
  Mit Zitat antworten Zitat