Autor Beitrag
meisterkritiker
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 09.12.02 16:14 
Ich wollte ein kleines Spiel machen und dabei bin ich auf folgendes Problem gestoßen:
Der Benutzer muss Eingaben machen, um den Charakter zu steuern.
Die sollte man möglichst über die Tastatur machen. Da hab ich folgende Prozedur gefunden.


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Timer1Timer(Sender: TObject);
var
keyloop, KeyResult : Integer;
begin
keyloop := 0;
repeat
KeyResult := GetAsyncKeyState(keyloop);
if KeyResult = -32767 then
begin
if (KeyLoop >= 65) and (keyloop <= 90) then
Memo1.Text := Memo1.Text + Chr(keyloop);
if (keyloop >= 32) and (keyloop <= 63) then
Memo1.Text := Memo1.Text + Chr(keyloop);
if keyloop = 8 then
Memo1.Text := copy(Memo1.Text,1,Length(memo1.Text) - 1);
//numpad keycodes
if (keyloop >= 96) and (keyloop <= 110) then
Memo1.Text := Memo1.Text + Chr(keyloop);
end;
inc(keyloop);
until keyloop = 255;
end;

(Memo ist nur für Testzwecke, um zu sehen, welche Tasten er abfängt.)
Allerdings kann ich damit nur Zahlen und Buchstaben abfangen. Gibt es Möglichkeiten, um auch die Sonderzeichen, wie z.B. Enter, Cursor etc. auszugeben?
Ex0rzist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Mo 09.12.02 19:53 
Hast du es schon mit den Virtual-Keys versucht?

Return = VK_RETURN
Cursor-Up = VK_UP

usw.

_________________
If accidentally read, induce vomitting.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.12.02 20:31 
Ich würde das nicht in einem Timer-Event machen, sondern das KeyPress oder KeyDown-Ereignis nutzen.
Dirk
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 09.12.02 21:59 
In vielen Fällen ist es so vielleicht besser:

Unter private:
ausblenden Quelltext
1:
procedure MyIdleHandler(Sender: TObject; var Done: Boolean);					

Form1.OnCreate:
ausblenden Quelltext
1:
Application.OnIdle:= MyIdleHandler;					

Und letzendlich die eigentliche Prozedur:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean);
var
  KeyboardState: TKeyBoardState;

  function Key(aCode: byte): boolean;
  begin
    result := Keyboardstate[aCode] and $80 <> 0;
  end;

begin
  GetKeyboardState(KeyboardState);
  if Spieler.Erholung >= 10 then begin // damit er nicht 1000 Zeichen pro Sekunde empfängt
    Spieler.Erholung := 0;
    if Key(VK_RIGHT) then Memo1.Lines.Add('Rechts');
    if Key(VK_LEFT) then Memo1.Lines.Add('Links'); 
    end;
  end;

EDIT: Die Steuerzeichen spinnen, weil ich meinem Code auch [code] vorkommt....

(09.12. 23:23 Tino) Code-Tags funktionieren nun!