Entwickler-Ecke

Windows API - Mehrere gedrückte Tasten gleichzeitig erkennen


DK99 - Di 05.05.09 09:09
Titel: Mehrere gedrückte Tasten gleichzeitig erkennen
Hi,
ich schreibe grade an einem Programm in dem der Spieler einfach durch ein Gebäude laufen kann. Um die Bewegungen zu steuern werden W,A,S,D über getasynckeystate abgefragt.
Um eine flüssigere Bewegung zu ermöglichen müsste ich allerdings erkennen ob
z.B. W und D gleichzeitig gedrückt gehalten werden. getasynckeystate liefert bei mir aber leider immer nur ein Ergebnis. Gibt es da irgenteine Möglichkeit das Problem zu lösen?
LG




bis jetzt sieht das so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//Bewegungsabfrage über Tastatur
if boolean(getasynckeystate(ord('W'))) then
begin
X := X + (MOVE_SPEED  * sin(degtorad(rotation)));
Z := Z + (MOVE_SPEED  * cos(degtorad(rotation)));
end;
if boolean(getasynckeystate(ord('A'))) then
begin
X := X + (MOVE_SPEED  * sin(degtorad(rotation-90)));
Z := Z + (MOVE_SPEED  * cos(degtorad(rotation-90)));
end;
if boolean(getasynckeystate(ord('D'))) then
begin
X := X + (MOVE_SPEED  * sin(degtorad(rotation+90)));
Z := Z + (MOVE_SPEED  * cos(degtorad(rotation+90)));
end;
if boolean(getasynckeystate(ord('S'))) then
begin
X := X + ((-1*MOVE_SPEED)  * sin(degtorad(rotation)));
Z := Z + ((-1*MOVE_SPEED)  * cos(degtorad(rotation)));
end;



Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 05.05.2009 um 09:37


Delete - Di 05.05.09 09:26

Ich nehme mal an, dass da technische Probleme/Gründe das gleichzeitige Drücken mehrerer Tasten nicht möglich machen. Eine Tastatur wird im Matrixverfahren vom Tastaturkontroller/Embedded Controller abgefragt und diente ursprünglich nur zur Text- und Steuercode-Eingabe - für Spieler ist eine Tastatur nicht besonders gut geeignet.


Xentar - Di 05.05.09 09:40

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Ich nehme mal an, dass da technische Probleme/Gründe das gleichzeitige Drücken mehrerer Tasten nicht möglich machen. Eine Tastatur wird im Matrixverfahren vom Tastaturkontroller/Embedded Controller abgefragt und diente ursprünglich nur zur Text- und Steuercode-Eingabe - für Spieler ist eine Tastatur nicht besonders gut geeignet.

Dann würde das aber alle Spiele betreffen, die man mit dieser Tastatur steuert. Und da heutzutage die meisten Spiele auf WSAD setzen, sehr unwahrscheinlich..
ich habs noch nie erlebt, dass man bei einem Shooter nicht gleichzeitig vorwärts und zur Seite laufen kann ;)

Edit:
Achso, das eigentliche Problem liegt übrigens in deiner Umwandlung in boolean..

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  CheckBox1.Checked := getasynckeystate(ord('W')) <> 0;
  CheckBox2.Checked := getasynckeystate(ord('D')) <> 0;
end;

funktioniert ohne Probleme.


thepaine91 - Di 05.05.09 09:50

Das heist nicht das er unrecht hat. Der Computer kann es nur so schnell verarbeiten. Das es für uns gleichzeitig wirkt.
Das Spiel fragt in dem Fall auch nur ab ob die Taste gedrückt wurde. Und dann läuft man solange bis die Taste wieder hochgelassen wird. d.h. er erkennnt erst >>> w dann a z.B. aber läuft seitwärts daher das die software weis das keine der beiden Tasten wieder losgelassen wurde =)


Xentar - Di 05.05.09 10:03

Ja, schon klar, dass die Tasten einfach nur schnell nacheinander abgefragt / verarbeitet werden.

Aber was user profile iconhathor wohl meinte war
http://de.wikipedia.org/wiki/Tastatur#Key_Rollover
und das ist hier definitiv nicht der Fall - es lag einfach nur an der Abfrage bzw. Auswertung von DK99.


DK99 - Do 07.05.09 12:42

ok vielen Dank für eure Antworten :)
Wenn ichs ohne boolean mache klappts prima 8) thx Xentar :D