AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bilder ineinander überlaufen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder ineinander überlaufen lassen

Ein Thema von Cöster · begonnen am 18. Jul 2006 · letzter Beitrag vom 18. Jul 2006
Antwort Antwort
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 19:35
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 19:38
Wieviel TImage-Instanzen hast du? Mit Alpha-Blending kann man mehrere Images "verschmelzen".
Markus Kinzler
  Mit Zitat antworten Zitat
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
Dax
(Gast)

n/a Beiträge
 
#4

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 19:55
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.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 20:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 20:21
Hast du schon einmal ein Spiel gesehen, bei dem die Laufanimation geblendet wird ? Ich jedenfalls nicht, stelle mir das Resultat auch ziemlich merkwürdig vor.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Namenloser

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

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 20:54
Zitat von Khabarakh:
Hast du schon einmal ein Spiel gesehen, bei dem die Laufanimation geblendet wird ? Ich jedenfalls nicht, stelle mir das Resultat auch ziemlich merkwürdig vor.
Ich auch, aber soll ers ausprobieren
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Bilder ineinander überlaufen lassen

  Alt 18. Jul 2006, 23:11
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.
Angehängte Dateien
Dateityp: zip ccclrescue_151.zip (282,0 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz