Autor Beitrag
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Mo 01.01.07 02:18 
Hi,

ich habe folgendes Spiel:

In einer Endlosschleife (procedure OnIdle) wird mein Spiel mit Hilfe von OpenGL gezeichnet. In dieser Endlosschleife gibt es nun auch ein paar tastaturabfragen, die ich mit getAsyncKeyState() realisiert habe. Das Ganze sieht folgendermaßen aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  if (getAsyncKeyState(112) <> 0and (KeyPressDelay[112]=0then
  begin
    Player.setWarping(not Player.getWarping);
    KeyPressDelay[112] := 25;
  end;

if not Player.getWarping then
begin

  if (getAsyncKeyState(113)<> 0and (KeyPressDelay[113]=0then
  begin
   if (getAsyncKeyState(113) <> 0then
      ShowMessage('Test-2');
    ShowMessage('Test-1');
    KeyPressDelay[GameSettings.getKeyMap(7)] := 15;
  end;

end;


Wie man erkennen kann, soll die Taste 113 (F2) nur etwas bewirken, wenn Player.getWarping=false ist. Dieses Attribut kann man mit F1 (key 112) wechseln. Da das Ganze eine Endlosschleife ist, muss zwischen den einzelnen Abfragen auch eine Pause eingefügt werden, damit die Keys nur alle ~0.5 Sekunden ausgelöst werden. Dazu ist das KeyPressDelay da, das später im Code auf 0 runter gezählt wird.

Nun zu meinem Problem:
Wenn ich nun mit F1 das Warping einschalte, reagiert das Programm wie gewollt nicht mehr auf Tastendrücke von F2. Drücke ich währen der Warping Phase nun aber F2, und setze danach Warping per Druck auf F1 wieder auf False, dann wird ein Tastendruck von F2 ausgelöst! Und das extrem skurile: Die MessageBox mit dem Inhalt "Test-2" wird NICHT angezeigt! MessageBox mit dem Inhalt "Test-1" hingengen schon! Das ist ist doch eigentlich gar nicht möglich, da die Bedingungen zum Anzeigen der Test-2 Box ja die selbe ist wie die Bedingung, dass der Tatsendruck überhaupt ausgelöst wird. Müsste also auf jeden Fall auch angezeigt werden o.O

Ich weiß nun nicht woran das liegt, habt Ihr hoffentlich ein paar Ideen?

Gutes Neues wünsche ich Euch allen!

Grüße
Passi
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 01.01.07 02:52 
Gehe ich richtig in der Annahme, dass ich das zum Testen einfach in OnIdle schreiben kann und dieser Effekt eintritt?
Ich probiers jedenfalls mal so aus...
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 01.01.07 10:55 
Kann ich reproduzieren. Bekomme auch Test-1, aber nicht Test-2 anzeigt.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Passi077 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Mo 01.01.07 13:09 
Gut, dann bin ich ja schon mal nicht alleine :)

Das Problem lag bei der Abfrage: Wenn ich auf <> 0 abfrage, werden wohl auch gepufferte Tastendrücke so lange gespeichert, bis sie ausgeführt werden. Daher wird auch die Test-2 Messagebox nicht angezeigt, weil mit der Abfrage vorher der Puffer geleert wurde.

Man muss auf <0 für einen Tastendruck, und auf >=0 für keinen Tastendruck abfragen, dann klappt es :)

Danke euch beiden und Grüße
Passi
Fighter#1
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 787

Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
BeitragVerfasst: Mo 01.01.07 13:59 
Hey Passi, hab noch ne Frage, in welcher Unit ist denn die Funktion KeyPressDelay ???
Ich hab sie standartmäßig nicht drin ... aber ich glaub die Funktion wäre sehr geschickt für mich :-), das bedeutet doch soviel, als dass KeyPressDelay[Ord('A')]=100 bedeutet, das eine Zehntel Sekund/100 Millisekunden die Taste "ignoriert" wird...?

_________________
Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mo 01.01.07 14:15 
Das ist wohl eher ein Array :lol: [zumindest habe ich es als Array benutzt ;-)]

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Fighter#1
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 787

Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
BeitragVerfasst: Mo 01.01.07 14:23 
Och schade :-(, da dacht ich gibts schon ne super fertige Funktion in soner Komponente und was ist ... ein Array :roll:

_________________
Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse