![]() |
Bilder ineinander überlaufen lassen
Hallo!
Es geht um das Laufen von Figuren in einem Jump'n'Run-Spiel. Ich habe insgesamt 6 Bilder, von denen immer eins zur Zeit visible ist. Welches das ist, ändert sich alle 150 Millisekunden. Das Laufen sieht aber noch ziemlich abgehackt aus, weil die Bilder nicht ineinander überlaufen. Ist es mit Delphi möglich, Bilder ineinander überlaufen zu lassen? |
Re: Bilder ineinander überlaufen lassen
Wieviel TImage-Instanzen hast du? Mit Alpha-Blending kann man mehrere Images "verschmelzen".
|
Re: Bilder ineinander überlaufen lassen
Also zur Überblendung von zwei Bitmaps habe ich folgenden Code gecshrieben:
Delphi-Quellcode:
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.
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; (So habe ich das jedenfalls gemacht) TSpieler könnte z.b. so aussehen (vereinfacht):
Delphi-Quellcode:
In der PaintRoutine wird dann das aktuelle bild gezeichnet:
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;
Delphi-Quellcode:
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 :wink:
Canvas.draw(Left,Top,Images[imageidx];
|
Re: Bilder ineinander überlaufen lassen
Hi Cöster, das menschliche Auge hat ein wesentlich höheres zeitliches Auflösungsvermögen als 150ms, eher was in der nähe von 50ms. Da hilft auch blending recht wenig, weil man immer noch "schlieren" in der Bewegung sieht, sind ja schließlich zwei Beine auf ein mal da.
|
Re: Bilder ineinander überlaufen lassen
Zitat:
|
Re: Bilder ineinander überlaufen lassen
Hast du schon einmal ein Spiel gesehen, bei dem die Laufanimation geblendet wird :gruebel: ? Ich jedenfalls nicht, stelle mir das Resultat auch ziemlich merkwürdig vor.
|
Re: Bilder ineinander überlaufen lassen
Zitat:
|
Re: Bilder ineinander überlaufen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab eine Demoversion des Spiels mal drangehängt, dann könnt ihr sehen, wie weit das Spiel ist. Wenn das Männchen läuft, kann man noch zu gut sehen, dass sich einfach nur ein paar Bilder abwechseln.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz