Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.05.18 14:12 
- 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: Mi 09.05.18 14:43 
Hier mal mein Beispiel mit Integer(Bit)-Flags:

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:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);
  end;

const 
    KLef: integer = 1 shl 0;  
    KRig: integer = 1 shl 1;
    KFwd: integer = 1 shl 2;
    KBwd: integer = 1 shl 3;

var
  Form1: TForm1;
  keys: Byte;
  running: boolean;

implementation

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject);
begin keys := 0; running := false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin
    case Key of
        37: keys := keys or KLef;
        38: keys := keys or KFwd;
        39: keys := keys or KRig;
        40: keys := keys or KBwd;
    end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin 
    case Key of
        37: keys := keys and not KLef;
        38: keys := keys and not KFwd;
        39: keys := keys and not KRig;
        40: keys := keys and not KBwd;
    end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin running := false;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if running then begin
        running := false;
        Canvas.TextOut(00'Click to Start                                 ');
    end else begin
        running := true;
        Canvas.TextOut(00'Click to Stop                                  ');

        while running do begin
            if keys and KLef > 0 then Left := Left - 1
            if keys and KRig > 0 then Left := Left + 1;
            if keys and KFwd > 0 then Top  := Top  - 1;
            if keys and KBwd > 0 then Top  := Top  + 1;
        
            Application.ProcessMessages;
        end;
    end;    
end;

procedure TForm1.FormPaint(Sender: TObject);
begin Canvas.TextOut(00'Click to toggle key listener                     ');
end;

end.

_________________
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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.05.18 19:49 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Hier mal mein Beispiel mit Integer(Bit)-Flags:

Das ist aber wieder mit KeyDown/KeyUp! Da habe ich wieder die Verzögerung!

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
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.

Für meine Zwecke reichen Ereignisse und Timer völlig!

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.

Wo setze ich die Flag und wo verarbeite ich sie für die Tastenabfrage? Ich muss ja erst einmal dem Programm mitteilen, dass eine der Pfeiltasten gedrückt wurde. Da kenne ich nur KeyDown, dort habe ich aber in jedem Fall eine Verzögerung.

_________________
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: Do 10.05.18 20:00 
Hast du den Code schon ausprobiert? Ich kann keine Verzögerung feststellen. Das KeyDown Event sollte keine Verzögerung verursachen, da es ja sofort ausgelöst wird, sobald die Taste gedrückt wurde.

_________________
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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.05.18 21:15 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Das KeyDown Event sollte keine Verzögerung verursachen, da es ja sofort ausgelöst wird, sobald die Taste gedrückt wurde.
Nein, ausprobiert nicht, aber was ich meine, ist: Halte mal in irgendeiner Textverarbeitung eine Taste gedrückt, meinetwegen "a". Da kommt dann:
a
Nun kommt eine Pause
dann kommt:
aaaaaaaaaaaaaaaaaaa
Das meine ich!

//Edit:
Ok, ich habe ihn in einer zusätzlichen Form zu meinem Projekt getestet, aber da tut sich gar nichts, einzig Mausklicks bewirken eine Änderung des dargestellten Textes. Also habe ich ein TEdit eingefügt, und im OI KeyPreview := True gesetzt. Deinen Code habe ich wie folgt abgeändert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    case Key of
        37:
         begin
           keys := keys or KLef;
           Edit1.Text := Edit1.text+'a';
         end;
//...

Und es passiert, was da immer passiert (ausser, man hat keine Tastaturverzögerung eingestellt): Es folgt ein "a", dann die Pause, dann "aaaaaa". Und die Pause will ich nicht!

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


Zuletzt bearbeitet von galagher am Do 10.05.18 21:28, insgesamt 2-mal bearbeitet
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: Do 10.05.18 21:17 
Wie gesagt, mit Flags sollte das nicht passieren. Probiers einfach aus!

_________________
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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.05.18 21:31 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt, mit Flags sollte das nicht passieren. Probiers einfach aus!
Das mache ich die ganze Zeit! Wo setze ich die Flags denn? Denn immer, wenn ich eine Taste drücke, "gibt Windows an mein Programm die eingestellte Verzögerung weiter" - das soll ja normalerweise auch so sein!

Also, wo setze ich ein Flag?

_________________
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: Do 10.05.18 21:35 
Was hast du denn bisher probiert? Kannst du mal deinen cide schicken?

Flags kannst du als einfache Booleans ausdrücken oder wie in meinem Beispiel als Bits von einem Integer-Typ. Da du nur 4 Tasten hast, reicht ein Byte (bis maximal 8 Tasten) aus

_________________
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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.05.18 21:44 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Was hast du denn bisher probiert? Kannst du mal deinen cide schicken?
Den habe ich wieder gelöscht. Wo ausser in KeyDown setze ich ein Boolean auf True, das angibt, dass eine Pfeiltaste gedrückt wurde? Wenn ich das erstmal weiss, kann ich die Prozedur aufrufen, die die Spielfigur steuert.

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Flags kannst du als einfache Booleans ausdrücken oder wie in meinem Beispiel als Bits von einem Integer-Typ. Da du nur 4 Tasten hast, reicht ein Byte (bis maximal 8 Tasten) aus
Das weiss ich, das ist aber nicht das Problem!

Vielleicht reden wir aneinander vorbei:
Ich möchte, dass mein Programm einen Pfeiltastendruck (die Pfeiltasten werden meistens gedrückt gehalten) verarbeitet, ohne dass dabei die übliche Verzögerung auftritt.

_________________
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: Do 10.05.18 21:48 
dein eigenes Programm muss dann irgendwo anders (entweder mit Application.ProcessMessages oder besser als separaten Thread) eigenständig laufen und die Flags abfragen, um etwas zu bewegen. Nur per Event das Spiel zu aktualisieren wird nicht funktionieren, wenn sich zB. etwas von allein bewegen soll.

_________________
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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.05.18 22:38 
user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
dein eigenes Programm muss dann irgendwo anders (entweder mit Application.ProcessMessages oder besser als separaten Thread) eigenständig laufen und die Flags abfragen, um etwas zu bewegen.

Ja, sieht so aus. Mit Threads habe ich mich noch nicht wirklich beschäftigt, vor alem fürchte ich, dass damit dann irgendwelche Probleme im Programm auftauchen.

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:
Nur per Event das Spiel zu aktualisieren wird nicht funktionieren, wenn sich zB. etwas von allein bewegen soll.

Mit Timern klappt das hervorragend!

_________________
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: Do 10.05.18 22:52 
Dann nimm Timer, wenn es dir gefällt

_________________
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)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.05.18 23:15 
- 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: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 14.05.18 12:01 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wie schon mehrmals erwähnt und zitiert, mit dem Timer bekommst du es gelöst.

Ja, aber der Timer stoppt die Spielfigur nicht exakt dann, wenn ich die Taste loslasse. Kann man aber sicher optimieren!

_________________
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 15.05.18 00:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -