Entwickler-Ecke

Multimedia / Grafik - DirectInput Gamepad-Button gedrückt wird zu oft ausgelöst


flaavia - Fr 26.12.03 13:07
Titel: DirectInput Gamepad-Button gedrückt wird zu oft ausgelöst
Hallo

Nachdem ich jetzt DirectInput endlich zum laufen gebracht habe, habe ich jetzt noch ein Problem mit der Tatsache, das das Drücken der Gamepad-Buttons entweder leicht verzögert (ca 1 sec) registriert wird (und die daran geknüpfte Aktion dann bei nur ganz kurzem Drücken des Buttons nicht gestartet wird) oder das Button-Gedrückt Ereignis gleich mehrfach ausgelöst wird (weil ich eben den Button länger drücken muss, damit überhaupt das ButtonGedrückt-Ereigniss registriert wird) und damit das Program auch nicht richtig läuft (Die auszulösende Aktion wird eben mehrfach gestartet, obwohl dies nur einmal bei Knopfdruck der Fall sein sollte.

Ich habe die GamePad-Buttongedrückt-Ereigniss-Abfrage folgendermaßen umgesetzt:


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:
procedure TfoMain.btDirectInputStartClick(Sender: TObject);
var
  diJoyState: TDIJoyState;
begin

  DIDJoystick.Acquire;

  Aborted:=False;
  
  repeat
    Application.ProcessMessages;
    // Joystickstatus in diJoyState speichern ...
    DIDJoystick.Poll;
    DIDJoystick.GetDeviceState(SizeOf(diJoyState), @diJoyState);

    // diJoyState.rgbButtons[0..31] -> Buttons des Joysticks / Gamepads; wenn >0 dann gedrückt...

    
          if ((diJoyState.rgbButtons[0]>0) and (foMain.Active = True) and ...) then btXYZ.Click;
             //das im Program mit dem Button btXYZ verknüpfte Ereignis wird ausgelöst
          if ((diJoyState.rgbButtons[1]>0) and...

    
  until (GetKeyState(VK_ESCAPE) and 128>0) or Aborted; // bis Taste ESCAPE oder Abbruch gedrückt ...
  
end;



Das ganze mit einem Timer abzufragen würde die Situation auch nicht ändern.
Ich würde mich sehr über Tips freuen, wie man dieses Problem prizipiell angeht (Der gedrückte Gamepad-Button soll das Ereigniss nur einmal auslösen, erst wenn er ein zweitesmal gedrückt wird, also nach loslassen und neu drücken, sollte das Ereigniss erneut ausgelöst werden).

Kann man auch etwas gegen die variable Zeit (bis zu 1/2 bis 1 Sek) unternehmen, bis das gedrückt-Ereignis registriert wird, so daß man den GamepadButton nicht dauernd gedrückt halten mus, bis man merkt, das der "Computer dies mitbekommen hat" :?:

Viele Dank für alle Tips

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Christian S. - Fr 26.12.03 13:34

Hallo!

Bitte nutze Delphi- statt Code-Tags. Ich habe dies schon in mehreren Postings für Dich geändert. Denke bitte demnächst daran!

Grüße
Peter


flaavia - Fr 26.12.03 16:29

@ Peter LustiG: Sorry für die Tags, mir war (und ist eigentlich gar nicht klar warum dies wichtig ist :oops: ) aber ich werde es selbstverständlich tun. Nur, was ist denn dann mit Code-Tags gemeint?


Christian S. - Fr 26.12.03 16:34

Hallo!

Code-Tags sind für allgemeinen Code gedacht, also nicht speziell Delphi-Source. Dabei ist eigentlich der einzige Effekt, dass die Leerzeichen am Anfang von Zeilen nicht entfernt werden.
Delphi-Tags sind speziell auf Delphi-Sourcecode zugeschnitten und unterstützen Syntax-Highlighting. Und weshalb Delphi-Tags durchaus Sinn machen, zeigt schon unten stehendes Beispiel. Der Source wird viel besser lesbar!

mit Code-Tags:

Quelltext
1:
2:
3:
4:
5:
6:
procedure meineProz;
VAR i : Integer;
begin
  Label1.Caption := 'Hallo';
  for i:=1 TO 10 DO irgendwas; //Ein Kommentar
end;

mit Delphi-Tags:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure meineProz;
VAR i : Integer;
begin
  Label1.Caption := 'Hallo';
  for i:=1 TO 10 DO irgendwas; //Ein Kommentar
end;


Überzeugend, oder? :)

Grüße
Peter


flaavia - Sa 27.12.03 16:02

:shock: :autsch: :D

überzeugt


hat denn auch noch jemand eine idee zu meínem am Anfang genannten Problem :nixweiss: :?:

Dies müsste doch ein Problem sein, das öfter vorkommt und zu dem es Lösungsansätze gibt (die mir leider noch aus mangelnder langzeitprogramiererfahrung fehlen)

Für alle Tips vielen Dank im voraus