Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ruckeln beim verschieben eines Raumschiffs (https://www.delphipraxis.net/54938-ruckeln-beim-verschieben-eines-raumschiffs.html)

Nils_13 13. Okt 2005 17:55


Ruckeln beim verschieben eines Raumschiffs
 
Hi,

wenn ich die linke oder rechte Pfeiltaste drücke, ruckelt es. DoubleBuffered hilft auch nicht. Kennt ihr eine Lösung oder andere Methode ? Es handelt sich hierbei um OpenGL. Das Raumschiff soll sich (man muss ja auch schnell vor schüssen etc. ausweichen) schnell und flutschig bewegen können.
Delphi-Quellcode:
var
  Leftp : integer;

{ ... }
procedure TGLForm.Render(Sender : TObject; var Done : Boolean);
{ ... }
// Position
glTranslatef(Leftp, 240, 0);

{ ... }
end;

{ ... }

procedure TGLForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RIGHT then
    Leftp := Leftp + 1 + 1;
  if Key = VK_LEFT then
    Leftp := Leftp - 1 - 1;
end;

100nF 13. Okt 2005 18:08

Re: Ruckeln beim verschieben eines Raumschiffs
 
hallo,

Delphi-Quellcode:
procedure TGLForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RIGHT then
    Leftp := Leftp + 1;
  if Key = VK_LEFT then
    Leftp := Leftp - 1;
end;
so besser?

wenn nicht, wäre ein bisschen mehr code noch nützlich. der code oben hat ja noch nicht viel mit raumschiff zu tun :gruebel:

Neutral General 13. Okt 2005 18:15

Re: Ruckeln beim verschieben eines Raumschiffs
 
Also du solltest schon hinschreiben das du mit OpenGL arbeitest.. weil das habe ich z.B nur durch glTranslatef gesehn..auf den zweiten Blick.. und ich glaube zwischen DelphiX, Windows Kompos und OpenGl ist ein großer Unterschied ;)
Außerdem finde ich die Sparte etwas unpassend. Multimedia (Grafik, Audio, Video, Spiele, Design, DirectX, OpenGL, MP3) <-- steht bei der beschreibung von Multimedia, passt da wohl besser ;)

Nils_13 13. Okt 2005 18:16

Re: Ruckeln beim verschieben eines Raumschiffs
 
ah ich idiot :wall: Das Raumschiff soll sich schnell, ohne Ruckeln bewegen.

Nils_13 14. Okt 2005 10:46

Re: Ruckeln beim verschieben eines Raumschiffs
 
Keine Idee :( ?
Ich hab den ersten Betrag erweitert:
Zitat:

Zitat von Nils
Das Raumschiff soll sich (man muss ja auch schnell vor schüssen etc. ausweichen) schnell und flutschig bewegen können.


jim_raynor 14. Okt 2005 11:04

Re: Ruckeln beim verschieben eines Raumschiffs
 
Nimm einen Timer, aber wenns geht einen genaueren als TTimer. Dort prüfst du immer, ob die Taste gedrückt ist:

Delphi-Quellcode:
if GetKeyState(VK_LEFT)<0 then
  // Taste ist gedrückt
Zusätzlich machst Leftp als Double und erhöhst nicht um 1 sonder um 0.1 oder so. Musst bissle damit rumprobieren.

Nils_13 14. Okt 2005 14:16

Re: Ruckeln beim verschieben eines Raumschiffs
 
Zitat:

Zitat von jim_raynor
Nimm einen Timer, aber wenns geht einen genaueren als TTimer. Dort prüfst du immer, ob die Taste gedrückt ist:

Delphi-Quellcode:
if GetKeyState(VK_LEFT)<0 then
  // Taste ist gedrückt
Zusätzlich machst Leftp als Double und erhöhst nicht um 1 sonder um 0.1 oder so. Musst bissle damit rumprobieren.

Allgemein schon viel besser, thx. Nur was verstehst du unter genauerem Timer ? Wo krieg ich einen her ?

jim_raynor 14. Okt 2005 14:42

Re: Ruckeln beim verschieben eines Raumschiffs
 
Zitat:

Zitat von Nils_13
Allgemein schon viel besser, thx. Nur was verstehst du unter genauerem Timer ? Wo krieg ich einen her ?

Nun der Standardtimer hat nur eine Auflösung von 50ms und deshalb sehr ungenau. Zum Beispiel ist bei DelphiX ein Timer dabei, der genauer sein soll. Aber mir kam ja nach dem Beitrag noch ne andere Variante. Du kannst ja die Abfrage in deiner Spielschleife machen (Stichwort: Zeitabhängige Bewegungen). Solltest ja genug dazu im Forum hier finden. Du misst mit Hier im Forum suchenQueryPerformanceCounter zwischen zwei Abfragen und anhand derer erhöhst / verringerst du LeftP. Also zum Beispiel:

Das Raumschiff bewegt sich in 1s um 1 Feld (LeftP+1). Durch die Zeitmessung stellst du jetzt fest, dass seid dem letzten durchlauf 10ms vergangen sind. Also würdest du LeftP nur um 0.01 erhöhen. Bei 20ms dann entsprechend 0.02.

QueryPerformanceCounter sollte man deshalb nehmen, weil dieser schon sehr genau ist. Auf jeden Fall wesentlich genauer als GetTickCount.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 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 by Thomas Breitkreuz