Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Image ruckelt bei Bewegung (https://www.delphipraxis.net/179323-image-ruckelt-bei-bewegung.html)

Tilo2804 26. Feb 2014 22:01

Delphi-Version: 7

Image ruckelt bei Bewegung
 
Hallo,
von der Schule aus programmiere ich derzeitig ein kleines jump and run Spiel, dabei habe ich jedoch das Problem, dass das Image, welches den Spieler darstellt bei der Bewegung immer anfängt zu flackern.
Ich habe auch schon DoubleBuffered ausprobiert, dabei hat sich jedoch nichts geändert.

Ist es möglich dieses Flackern zu entfernen und wenn ja, wie?

Gruß Tilo

Volker Z. 26. Feb 2014 22:53

AW: Image ruckelt bei Bewegung
 
Hallo,

und ein herzliches Willkommen in der DP.

Geht Deine Fehlerbeschreibung nicht auch etwas genauer?

Zitat:

[...] dabei habe ich jedoch das Problem, dass das Image, welches den Spieler darstellt bei der Bewegung immer anfängt zu flackern. Ich habe auch schon DoubleBuffered ausprobiert, dabei hat sich jedoch nichts geändert
Sei mir bitte nicht böse, aber das liest sich wie: Ich schmiere Butter auf' ne Stulle, und wenn die dann auf den Boden fällt, dann landet die immer mit der Butterseite unten und ich hab den ganzen Staub und Dreck in der Butter hängen. Wenn ich die doppelte Menge Butter nehme und die Stulle fällt zu Boden, dann ändert sich aber auch nix - immer noch hängt der ganze Schmodder in der Butter -, kann man das nicht ändern.

Bitte versuch Dein Problem genauer zu beschreiben (eventuell hilft auch Code hier anzuhängen).

Gruß

Gutelo 27. Feb 2014 01:58

AW: Image ruckelt bei Bewegung
 
Hallo Tilo,

Wie zeichnest du den Spieler?

1) TImage auf Form, dann setzen der Properties Left und Top?
2) TPaintBox, zeichnen des Spieler mittels TPaintBox.Canvas.Rectangle fuer Hintergrund und TPaintbox.Canvas.Draw fuer Spieler Bild ?
3) ?

Falls du mehrere Dinge zeichnest solltest du zunaechst ein Bitmap im Speicher fertig machen und anschliessend das fertige Bild anzeigen lassen. Zum Beispiel so

Code:
Procedure MoveSpieler(MyPaintBox : TPaintBox; xpos : integer; ypos : integer);
var bmp : TBitmap;
    bmpSpieler : TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.Width := MyPaintBox.canvas.Width;
  bmp.Height := MyPaintBox.canvas.Height;

  bmpSpieler := TBitmap.Create;
  bmpSpieler.loadFromFile('Spieler.bmp');

  // hier alles auf bmp.canvas zeichnen
  bmp.canvas.brush.color := clWhite;
  bmp.canvas.pen.color := clWhite;
  bmp.canvas.Rectangle(0,0,bmp.width,bmp.height);
  bmp.canvas.Draw(xpos,ypos,bmpSpieler);

  BitBlt(MyPaintBox.canvas.Handle, 0, 0, bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, SRCCOPY);
  bmp.Free;
end;
bmpSpieler solltest du natuerlich global machen, damit du es nur einmal laden musst.

Wie Volker bereits sagte, man braucht mehr Informationen, da es unzaehlige Moeglichkeiten gibt ein bewegtes Bitmap zu implementieren...

Tilo2804 27. Feb 2014 20:03

AW: Image ruckelt bei Bewegung
 
Ich habe ein Panel, welches den Spieler darstellt. Dies ist nicht sichbar. Darauf lege ich ein Image mit dem Spieler.
Um den Spieler zu bewegen verändere ich den Wert left und top.

Hier der Quelltext des Sprungs:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var j            : integer;
    Gegend_Datei : File of TGegend;
    Gegend       : TGegend;
    hoch         : boolean;
begin
///////hochspringen///////////

  if i <= Sprunghoehe // Sprunghöhe ist derzeitig bei 30 
    then
      begin
      AssignFile(Gegend_Datei,'GegendDatei.dat'); { GegendDatei umfasst alle Objekte mit dem der Spieler kolidieren kann} 
      Reset(Gegend_Datei);
      hoch:= true;
        for j:=1 to AnzahlPanels do
          begin
            Read(Gegend_Datei,Gegend);
            if (Gegend.Left <= Panel1.Left + Panel1.Width ) and (Gegend.Left + Gegend.Widht >= Panel1.Left)
        then
            if (Panel1.Top >=Gegend.Top + Gegend.Height - 3) and (Panel1.Top <= Gegend.Top + Gegend.Height +3)
              then hoch := false;
          end;
        if hoch = true
          then
            begin
              Panel1.Top:= Panel1.Top - 2;
              if Form1.VertScrollBar.Position > 6 then
              Form1.VertScrollBar.Position:=Form1.VertScrollBar.Position-2; // Bildausschnitt bewegt sich mit Figur mit
              Inc(i);
            end;
        if hoch = false then i:=Sprunghoehe + 1;
        CloseFile(Gegend_Datei);
      end;

///////Kollisionsabfrage///////////

  AssignFile(Gegend_Datei,'GegendDatei.dat');
  Reset(Gegend_Datei);
  for j:=1 to AnzahlPanels do
    begin
      Read(Gegend_Datei,Gegend);
      if (Gegend.Left + Gegend.Widht >= Panel1.Left ) and (Gegend.Left < Panel1.Left + Panel1.Width)
        then
          if (Panel1.Top + Panel1.Height <= Gegend.Top +3) and (Panel1.Top + Panel1.Height >= Gegend.Top-3)
            then
              begin
                if h = true then i:=0;
                if h = false
                  then
                    begin
                      timer1.Enabled:=false;
                      if i>=450 then showmessage('TOT'); // Spieler stirbt ab bestimmter Falltiefe
                      i:=0;
                    end;
              end;
    end;
  CloseFile(Gegend_Datei);

///////Herunterfallen///////////

  if i > Sprunghoehe
    then
      begin
        if Form1.VertScrollBar.Position <> 1800 then
        Form1.VertScrollBar.Position:=Form1.VertScrollBar.Position+2; // Bildausschnitt bewegt sich mit Figur mit
        Panel1.Top:= Panel1.Top + 2;
        Inc(i);
        if i>=250
          then
            begin
              showmessage('TOT');
              i:=0;
              timer1.Enabled:=false;
            end;
      end;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
  Image15.Left:=Panel1.Left;
  Image15.Top:=Panel1.Top;
end;
Timer1 läuft im Intervall von 1ms

Timer3 setzt das Image im Intervall von 10ms immer wieder auf das Panel.

DoubleBuffered ist auf true

die Variable hoch wird auf false gesetzt, wenn der Spieler nur herunterfallen soll und nicht zuvor hochspringen

die Variable h wird auf true gesetzt wenn man die Sprungtaste (Space) drückt
wenn diese losgelassen wird, dann ist h = false


Es ist mir auch aufgefallen, dass es stärker flackert, wenn sich die Spielfigur wieder nach unten bewegt

Tilo2804 27. Feb 2014 20:21

AW: Image ruckelt bei Bewegung
 
ok das Problem hat sich gelöst ich hatte bei meiner bewegung nach rechts und links noch ein Befehl stehen welcher auch die Position des Images verändert.

Trotzdem danke :)

himitsu 27. Feb 2014 20:56

AW: Image ruckelt bei Bewegung
 
Timer mit 1ms kannst du vergessen.
Timer haben, ebenso wie GetTickCount, ein typisches Intervall von Vielfachen zu je durchschnittlich 16 Millisekunden.

Zitat:

Delphi-Quellcode:
        if i>=250
          then
            begin
              showmessage('TOT');
              i:=0;
              timer1.Enabled:=false;
            end;

Den Timer nach der MessageBox abzuschalten ist auch keine gute Idee.

Und wieso wird innerhalb von TForm1-Methoden auf die globale Form1-Variable zugegriffen? (du bist ja schon in der Form drin)

Jedesmal die Datei einlesen? (alle 16 Millisekunden, wobei du das ja sogar 1000 Mal die Sekunde geplant hattest)
Wieso nicht einmal einlesen und dann mit der schnellen Kopie im RAM arbeiten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 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