Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bilder ineinander überlaufen lassen (https://www.delphipraxis.net/73477-bilder-ineinander-ueberlaufen-lassen.html)

Cöster 18. Jul 2006 18:35


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?

mkinzler 18. Jul 2006 18:38

Re: Bilder ineinander überlaufen lassen
 
Wieviel TImage-Instanzen hast du? Mit Alpha-Blending kann man mehrere Images "verschmelzen".

Namenloser 18. Jul 2006 18:54

Re: Bilder ineinander überlaufen lassen
 
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:
Delphi-Quellcode:
  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 :wink:

Dax 18. Jul 2006 18:55

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.

Cöster 18. Jul 2006 19:16

Re: Bilder ineinander überlaufen lassen
 
Zitat:

Zitat von Dax
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.

Ich weiß, das menschliche Auge hat eine Reaktionszeit von 20 ms. wenn ich den Timer allerdings auf 20 ms einstelle, bräuchte ich 8mal so viele Bilder. Genau diese Arbeit will ich mir ja ersparen. Deswegen suche ich nach einen Befehl, der 150 ms braucht, um ins nächste Bild zu überlaufen

Khabarakh 18. Jul 2006 19:21

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.

Namenloser 18. Jul 2006 19:54

Re: Bilder ineinander überlaufen lassen
 
Zitat:

Zitat von Khabarakh
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.

Ich auch, aber soll ers ausprobieren :wink:

Cöster 18. Jul 2006 22:11

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