Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2292
Erhaltene Danke: 44

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: Mo 07.05.18 19:52 
Hallo!

Ich möchte in meinem Programm - und nur dort! - die Tastaturverzögerung ausschalten! Wie geht das denn?

lg
galagher


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 07.05.2018 um 22:07

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10102
Erhaltene Danke: 1212

W2k .. W7pro .. W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.05.18 22:09 
Moin!

Womit dein Programm, unterstellt, dass man Windows überhaupt sowas begebogen kriegt, faktisch unbenutzbar wird. :shock: Welchen Sinn sollte das haben? :gruebel: :nixweiss:
Suchst du nicht eher sowas? Suche im MSDN GETASYNCKEYSTATE :lupe: :think:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: galagher
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.05.18 00:37 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2292
Erhaltene Danke: 44

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: Di 08.05.18 08:14 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Welchen Sinn sollte das haben? :gruebel: :nixweiss:
Für ein Spiel, das man auf die altmodische Art per Pfeiltasten steuert, da wäre es nützlich, keine Verzögerung der Tasten zu haben!

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Suchst du nicht eher sowas? Suche im MSDN GETASYNCKEYSTATE :lupe: :think:
Wenn da etwas dabei ist, das das kann, ja!


user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
eine solche Einstellung gilt systemweit und kann daher auch nicht für die Anwendung allein umgestellt werden.
Das ist eher schlecht, denn der unschöne Umweg wäre dann, bei Programmstart den aktuellen Wert zu sichern, dann auf 0 zusetzen und bei Programmende den gesicherten Wert wieder zurück zu setzen, bzw. ist das ja jedesmal notwendig, wenn das Programm den Fokus verliert.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 458
Erhaltene Danke: 90

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 08.05.18 08:42 
Tut auch überhaupt nicht Not, sowas zu machen.

Per AsyncKeyState kann man feststellen, ob eine Taste gedrückt ist. Nun kann man seine Spielfigur so lang ein die passende Richtung bewegen, bis man merkt, das die Taste eben nicht mehr gedrückt ist.

Geht auch einigermaßen per OnKeyDown, OnKeyUp.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.05.18 16:34 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 08.05.18 17:45 
Also bisher hat bei mir TForm1.FormKeyDown bzw TForm1.FormKeyUp immer ausgereicht bei dem, was ich an Delphi an Spielchen gemacht habe.
Da man in Delphi sowiso nur langsamere Spiele hinbekommt, sollte die Tastatur im Endeffekt nicht dein größtes Pronblem sein.

solltest du wirklich vorhaben ein schnelles Spiel zu entwickeln empfehle ich dir entweder eine Spielengine wie Unity oder Unreal etc. oder C++ oder Java und OpenGL oä. Muss ja nichtmal 3D sein...
Ist nur für den Anfang mit sehr großen Kanonen geschossen ;)

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2292
Erhaltene Danke: 44

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: Di 08.05.18 18:43 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
GetAsyncKeyState() hat seine Berechtigung. Es reagiert "schneller" auf Tasteneingaben.

Ich finde die Lösung mit Msg.CharCode am Besten, da läuft alles flüssiger:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
protected
  procedure Steuerung(var Msg: TWMKEYDOWN); message WM_KEYDOWN;
end;

//..

procedure TForm1.Steuerung(var Msg: TWMKEYDOWN);
begin
  if (Msg.CharCode = VK_LEFT) or (Msg.CharCode = VK_RIGHT) or //..
end;

Das behebt aber leider nicht die Verzögerung der Pfeiltasten, GetAsyncKeyState() übrigens auch nicht!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.05.18 19:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1182
Erhaltene Danke: 96

Win7
DXE2 Prof, Lazarus
BeitragVerfasst: Di 08.05.18 19:05 
Warum soll es mit GetAsyncKeyState() Verzögerungen geben?
Ich vermute, das hängt nur am Intervall der Abfrage und wie Du die gewonnen Informationen verwendest um eine Reaktion zu visualisieren.

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Da man in Delphi sowiso nur langsamere Spiele hinbekommt, sollte die Tastatur im Endeffekt nicht dein größtes Pronblem sein.

Das hier unter Delphi zu posten halte ich schon ein bisschen für Blasphemie. Versuch es doch erstmal!

_________________
Solange keine Zeile Code geschrieben ist, läuft ein Programm immer fehlerfrei.
Ich teste nicht, weil ich Angst habe Fehler zu finden.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2292
Erhaltene Danke: 44

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: Di 08.05.18 19:27 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Schwer zu sagen, was du mit der Abfrage bezwecken möchtest?![/delphi]

Naja, die Spielfigur bewegen! Funktioniert auch sehr gut, nur nach dem Drücken einer Pfeiltaste passiert, was eben normalerweise passiert, wenn man eine Taste drückt: Die Spielfigur bewegt sich in die gewünschte Richtung (die Taste "wirkt sich also aus"), dann folgt eine kurze Pause, dann geht's weiter. Die Tastaturverzögerung eben!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das ginge noch etwas kürzer: if Msg.CharCode in [VK_LEFT, VK_RIGHT, ...] then

Das ist natürlich noch eleganter!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 08.05.18 20:56 
Nun, in dem Fall hast du einen einfach zu behebenden "Denkfehler". Denn du verwendest die Funktion der Tastatur, dass das OnKey Event bei langem Drücken oft ausgelöst wird. In der Spieleentwicklung macht man das aber anders:
Wenn eine Taste gedrückt wird, setzt man eine entsprechende Flag, die markiert, dass die Taste gedrückt wurde. Die verwendest du dann auch für deine Tastenabfrage. Und wenn schließlich das OnKeyUp Event ausgelöst wurde entfernst du die Flag wieder. Die Flag kann ein einfacher Boolean oder ein Integer (im Binärsystem) sein.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)

Für diesen Beitrag haben gedankt: galagher
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.05.18 23:31 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Di 08.05.18 23:41 
@Frühlingsrolle Beispiel: Öffne den Text-Editor, halte einen beliebigen Buchstaben gedrückt und schau, was passiert. Genau das gleiche Verhalten zeigt sich in seinem Spiel. Das meint er

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Di 08.05.18 23:52 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i : Integer;

implementation

{$R *.dfm}

//beliebige Taste drücken
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
// hier kann man die Taste auswerten
// z.B. if Key=...
  if True then inc(i);
  Label1.Caption:= INTTOSTR(i);
end;

end.


Eine Verzögerung kann ich bei diesem Beispiel nicht feststellen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.05.18 00:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Mi 09.05.18 01:12 
Mein Beispiel läuft in 4 sec 100x durch die Routine.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    Label3: TLabel;
    Button1: TButton;
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i : Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
//beliebige Taste drücken z.B. SPACE
// hier kann man die Taste auswerten
// z.B. if Key=...
  if i=0 then Label3.Caption:= TimeToStr(Now);

  if True then inc(i);
  Label1.Caption:= INTTOSTR(i);
  Label2.Caption:= TimeToStr(Now);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  i:=0;
  Label1.Caption:= '0';
  Label2.Caption:= '0';
  Label3.Caption:= '0';
  Button1.SetFocus;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Button1.SetFocus;
  Label1.Caption:= '0';
  Label2.Caption:= '0';
  Label3.Caption:= '0';
end;

end.
Einloggen, um Attachments anzusehen!
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mi 09.05.18 07:18 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es das ist, was Symbroson meinte, dann könnte man auf den TTimer ausweichen und im OnTimer Ereignis jene Tasten mit GetAsyncKeyState() abfragen.
Was ist das kleinstmögliche Intervall dafür? 50ms?

Wie gesagt, Flags zu nutzen finde ich ist die beste Variante. Wie ein Lichtschalter.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1182
Erhaltene Danke: 96

Win7
DXE2 Prof, Lazarus
BeitragVerfasst: Mi 09.05.18 09:52 
Du kannst bei einem "echten Spiel" ja nicht rein mit den Ereignissen arbeiten wie ein normales Windows Programm. Das reicht nicht um einen gleichmäßigen Spielfluss hinzubekommen.
Du braucht einen Renderer für die Anzeige, am besten in einem eigenen Thread. So bekommst du es auch hin das sich alles gleichmäßig bewegt.
Du brauchst einen weiteren Thread der sich Tastatur und Maus zur Brust nimmt und alles, am besten als Flags bereitstellt.
Und natürlich einen weiteren Thread in dem die ganzen Positionsinformationen in deiner Spielewelt zusammengestellt werden, die dann der Renderer in Bilder umsetzt.

Anstatt mit Threads kann man am Anfang auch mit Timern arbeiten. Aber die können nicht parallel ausgeführt werden, sind also nicht für rechenintensive Aufgaben geeignet.
Was die Anzeige / das Rendern angeht, das ist immer einen Kanonen und Spatzen Frage. OpenGL, Direct2D. Beide können für 2D Ausgabe verwendet werden. Das hinten dran hängt vom Anwendungsfall ab.

_________________
Solange keine Zeile Code geschrieben ist, läuft ein Programm immer fehlerfrei.
Ich teste nicht, weil ich Angst habe Fehler zu finden.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2292
Erhaltene Danke: 44

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter, Delphi 10.2 Tokyo Community Edition
BeitragVerfasst: Mi 09.05.18 10:58 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
In der Spieleentwicklung macht man das aber anders:
Wenn eine Taste gedrückt wird, setzt man eine entsprechende Flag, die markiert, dass die Taste gedrückt wurde. Die verwendest du dann auch für deine Tastenabfrage. Und wenn schließlich das OnKeyUp Event ausgelöst wurde entfernst du die Flag wieder. Die Flag kann ein einfacher Boolean oder ein Integer (im Binärsystem) sein.

Klingt gut, werde versuchen, das umuzsetzen!

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
@Frühlingsrolle Beispiel: Öffne den Text-Editor, halte einen beliebigen Buchstaben gedrückt und schau, was passiert. Genau das gleiche Verhalten zeigt sich in seinem Spiel. Das meint er

Genau!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!