AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Image ruckelt bei Bewegung

Ein Thema von Tilo2804 · begonnen am 26. Feb 2014 · letzter Beitrag vom 27. Feb 2014
Antwort Antwort
Tilo2804

Registriert seit: 26. Feb 2014
3 Beiträge
 
#1

Image ruckelt bei Bewegung

  Alt 26. Feb 2014, 23:01
Delphi-Version: 7
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
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Image ruckelt bei Bewegung

  Alt 26. Feb 2014, 23:53
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#3

AW: Image ruckelt bei Bewegung

  Alt 27. Feb 2014, 02:58
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...

Geändert von Gutelo (27. Feb 2014 um 03:00 Uhr)
  Mit Zitat antworten Zitat
Tilo2804

Registriert seit: 26. Feb 2014
3 Beiträge
 
#4

AW: Image ruckelt bei Bewegung

  Alt 27. Feb 2014, 21:03
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

Geändert von Tilo2804 (27. Feb 2014 um 21:07 Uhr)
  Mit Zitat antworten Zitat
Tilo2804

Registriert seit: 26. Feb 2014
3 Beiträge
 
#5

AW: Image ruckelt bei Bewegung

  Alt 27. Feb 2014, 21:21
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.151 Beiträge
 
Delphi 12 Athens
 
#6

AW: Image ruckelt bei Bewegung

  Alt 27. Feb 2014, 21:56
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:13 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