Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Image.position ohne Anfangsgeruckel (https://www.delphipraxis.net/190584-image-position-ohne-anfangsgeruckel.html)

derseitzer 18. Okt 2016 13:21

Delphi-Version: 5

Image.position ohne Anfangsgeruckel
 
Hallo zusammen,

Ich programmiere gerade ein Spiel, für das ich die Position eines TImages ändern will.
Also so ähnlich: image1.position.x:= image1.position.x + 5;

Dieser obige Code wird immer aktiv, wenn ich eine Taste auf der Tastatur drücke.. bisher noch kein Problem.
Wenn ich die Taste gedrückt halte, führt er den Befehl immer wieder aus, was ebenfalls gut ist.
Also ungefähr so:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;Shift: TShiftState);
begin
if Key = VKRight then
begin
Mario.Position.X:=Mario.Position.X +8;


Das Problem ist, dass das Bild sich am Anfang zuerst langsamer bewegt und dann erst mit normaler Geschwindigkeit.
(Wenn Sie nicht wissen was ich meine:
Das gleiche passiert, wenn man einfach nur ein Timage erstellt und es dann mit STRG + beliebige Pfeiltaste steuert und die Pfeiltaste gedrückt hält.
-> zuerst langsam, dann schneller)

Frage: Wie bekomme ich eine sofortige gleichbleibende Geschwindigkeit mit meinem Code hin?
MFG derseitzer

Der schöne Günther 18. Okt 2016 13:28

AW: Image.position ohne Anfangsgeruckel
 
Das gleiche bekommst du zum Beispiel in der Delphi-Praxis: Tippe doch mal einen Text und halte z.B. die Taste D gedrückt: ddddddddddddddddddd.

Mehr bekommt das
Delphi-Quellcode:
OnKeyDown
-Ereignis der Form auch nicht mit, ist nun mal so. Mit
Delphi-Quellcode:
OnKeyPress
ist es ähnlich. Jetzt frage ich mich auch: Was macht man da? Einen Keyboard-Hook?

derseitzer 18. Okt 2016 13:30

AW: Image.position ohne Anfangsgeruckel
 
Ja genau. Gibt es dann keine Möglichkeit z.B. eine Figur, die mit Pfeiltasten steuerbar sein soll, ohne diesen Effekt zu bewegen???

bra 18. Okt 2016 13:36

AW: Image.position ohne Anfangsgeruckel
 
Das ist doch eine Windows-Einstellung (Einstellungen -> Tastatur -> Verzögerung) und so ziemlich das erste, was ich an einem Windows-PC immer hochstelle, weil mich die Verzögerung tierisch nervt.

Aviator 18. Okt 2016 13:44

AW: Image.position ohne Anfangsgeruckel
 
Du könntest auch im KeyDown einen Timer starten der mit einem festen Intervall abläuft. Im KeyUp wird der Timer dann wieder gestoppt. Und im Timer Event bewegst du entsprechend dein Image.

derseitzer 18. Okt 2016 14:40

AW: Image.position ohne Anfangsgeruckel
 
Ok ich bedanke mich erstmal für eure Tipps!
Das mit der Windows-Einstellung ist richtig aber natürlich eine schlechte Option, falls ich das Spiel auch auf anderen Computern spielen möchte.
Ich werde es mal mit Timern probieren danke:)

t.roller 18. Okt 2016 18:50

AW: Image.position ohne Anfangsgeruckel
 
Panel1, darauf Image1, mit Code unten ruckelt nichts:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of
    VK_UP:
      Panel1.Top:= Panel1.Top-5;
    VK_DOWN:
      Panel1.Top:= Panel1.Top+5;
    VK_LEFT:
      Panel1.Left:= Panel1.Left-5;
    VK_RIGHT:
      Panel1.Left:= Panel1.Left+5;
end;

Der schöne Günther 18. Okt 2016 19:44

AW: Image.position ohne Anfangsgeruckel
 
Es geht im Endeffekt um die "Repeat-Rate" der Tastatur. Also dass es erst einen Sprung macht, dann Pause, und dann schnell wiederholend, nicht um den Bildaufbau selber.

t.roller 18. Okt 2016 20:54

AW: Image.position ohne Anfangsgeruckel
 
Vielleicht ist die CPU einfach zu langsam - oder die GPU...

Meine Tastatur sendet 31 Zeichen/sec.
Mit FormKeyDown zähle ich max. 27.
Delphi-Quellcode:
function GetKeySpeed: Integer;
var
I: LongBool;
Value: Integer;
begin
I := SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, @Value, 0);
Result := Value;
end;

stahli 19. Okt 2016 11:23

AW: Image.position ohne Anfangsgeruckel
 
Gab es nicht so etwas wie GetKeyState?

Dann würde man in einer Schleife immer wieder prüfen, welche Tasten JETZT GERADE gedrückt sind und nicht Tastaturereignisse abarbeiten.

Das hat natürlich den Nachteil, dass es aufwendiger wäre und man alle Varianten berücksichtigen muss, um die Schleife auch wieder beenden zu können.


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