Autor |
Beitrag |
galagher
Beiträge: 2527
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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 Narses: 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
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 07.05.18 22:09
Moin!
Womit dein Programm, unterstellt, dass man Windows überhaupt sowas begebogen kriegt, faktisch unbenutzbar wird. Welchen Sinn sollte das haben?
Suchst du nicht eher sowas? GETASYNCKEYSTATE
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
|
Verfasst: Di 08.05.18 00:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2527
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.05.18 08:14
Narses hat folgendes geschrieben : | Welchen Sinn sollte das haben? |
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!
Wenn da etwas dabei ist, das das kann, ja!
Frühlingsrolle hat folgendes geschrieben : | 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
Beiträge: 486
Erhaltene Danke: 99
Win7, Win81, Win10
Tokyo, VS2017
|
Verfasst: 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
|
Verfasst: Di 08.05.18 16:34
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
Beiträge: 2527
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.05.18 18:43
Frühlingsrolle hat folgendes geschrieben : | 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:
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
|
Verfasst: Di 08.05.18 19:00
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Sinspin
Beiträge: 1332
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
Symbroson hat folgendes geschrieben : | 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!
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
galagher
Beiträge: 2527
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.05.18 19:27
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
|
Verfasst: Di 08.05.18 23:31
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Di 08.05.18 23:52
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 public end;
var Form1: TForm1; i : Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char); begin 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
|
Verfasst: Mi 09.05.18 00:00
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
t.roller
Beiträge: 118
Erhaltene Danke: 34
|
Verfasst: Mi 09.05.18 01:12
Mein Beispiel läuft in 4 sec 100x durch die Routine.
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 public end;
var Form1: TForm1; i : Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char); begin 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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mi 09.05.18 07:18
Frühlingsrolle hat folgendes geschrieben : | 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
Beiträge: 1332
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
galagher
Beiträge: 2527
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 09.05.18 10:58
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|