![]() |
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 |
AW: Image ruckelt bei Bewegung
Hallo,
und ein herzliches Willkommen in der DP. Geht Deine Fehlerbeschreibung nicht auch etwas genauer? Zitat:
Bitte versuch Dein Problem genauer zu beschreiben (eventuell hilft auch Code hier anzuhängen). Gruß |
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:
bmpSpieler solltest du natuerlich global machen, damit du es nur einmal laden musst.
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; Wie Volker bereits sagte, man braucht mehr Informationen, da es unzaehlige Moeglichkeiten gibt ein bewegtes Bitmap zu implementieren... |
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:
Timer1 läuft im Intervall von 1ms
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; 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 |
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 :) |
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:
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 17:42 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