RawInput Joypad Reihenfolge

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.

RawInput Joypad Reihenfolge

Beitragvon Ch4vy » 19.09.2017, 12:49

hallo,

dank des tollen rawinput guides von krishty https://zfx.info/viewtopic.php?f=11&t=2977 kann ich nun meinen xbox one controller über rawinput ansteuern. allerdings habe ich ein problem. wie entscheide ich welcher controller welchem spieler zugewiesen werden soll?

momentan mache ich folgendes. ich benütze die winapi funktion GetRawInputDeviceList und gehe die liste von hinten nach vorne durch. der letzte controller wird player 1 zugewiesen, der vorletzte controller player 2 usw.

das ganze deckt sich auch mit der reihenfolge ab, in welcher ich die controller ursprünglich eingeschaltet habe. wenn ich im laufendem spiel einen dritten controller einschalte, fange ich die WM_INPUT_DEVICE_CHANGE nachricht ab und weise den neuen controller player 3 zu.

wenn ich jetzt aber die anwendung schliesse und neu starte, wird der dritte controller player 1 zugewiesen, der zweite controller player 2 und der erste controller player 3, da die zurückgegebene GetRawInputDeviceList liste nun ganz anders aussieht, durch den neuen controller.

falls ich das folgende tutorial http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/ richtig verstanden habe, dann scheint windows bereits eine art eigene interne reihenfolge der controller zu besitzen.

Code: Ansicht erweitern :: Alles auswählen
USAGE_PAGE (Generic Desktop)
USAGE (Game Pad)
COLLECTION (Application)
COLLECTION (Physical)
REPORT_ID (1) <--- Player 1 ???
...
END COLLECTION
END COLLECTION
USAGE_PAGE (Generic Desktop)
USAGE (Game Pad)
COLLECTION (Application)
COLLECTION (Physical)
REPORT_ID (2) <--- Player 2 ???
...
END COLLECTION
END COLLECTION


allerdings habe ich absolut keinen schimmer, wie ich diese informationen auslesen soll. bei den ganzen HidD/P funktionen und HIDD/P strukturen, blicke ich überhaupt nicht mehr durch welche für was zuständig ist.

falls sich jemand damit auskennt, würde ich mich über einen kurzen beispielcode sehr freuen. danke!
Ch4vy
 
Beiträge: 2
Registriert: 19.09.2017, 12:11

Re: RawInput Joypad Reihenfolge

Beitragvon Krishty » 19.09.2017, 13:09

Ich glaube nicht, dass du mit der Report-ID unterschiedliche Controller erkennen kannst. So kannst du nur bei einem physischen Gerät die unterschiedlichen logischen Nutzungsarten erkennen.

Mir fällt auf Anhieb ein, den NT-Pfad zu nutzen (so wie in der Enumeration hier: viewtopic.php?f=11&t=2977#p39216 ). AFAIK bleibt der unter Windows konstant, bis das Gerät wieder getrennt oder das System neu gestartet wird.

Wenn die Anwendung neu startet, fragst du also wieder die Liste angeschlossener HIDs ab, und vergleichst danach ihre Pfade mit denen vom vorherigen Lauf (die du irgendwo gespeichert hast).

Bei mir sehen die Pfade aus wie z.B. \\?\HID#VID_07B5&PID_0316#7&f0decf&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}; ich weiß, dass NT ebenso Pfade im Format \\?\Device0\ hat. Mehr fällt mir dazu aber gerade auch nicht ein …

Nachtrag: Die Pfade enthalten scheinbar eine UID. Es könnte also durchaus sein, dass sie sogar über Neustarts hinweg konstant sind – würde sich perfekt für Benutzereinstellungen eignen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5973
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: RawInput Joypad Reihenfolge

Beitragvon Ch4vy » 19.09.2017, 18:22

Krishty hat geschrieben:Ich glaube nicht, dass du mit der Report-ID unterschiedliche Controller erkennen kannst.

das möchte ich ja rausfinden, obs wirklich stimmt. weiss aber nicht wie ich überhaupt erst diese infos auslesen kann.

die pfade benutze ich ja schon, um die jeweiligen controller eindeutig zu identifizieren. um beim aus- und wieder einschalten, den richtigen controller, dem richtigen spieler wieder zuzuweisen (während das spiel läuft). allerdings sagen die pfade nichts darüber aus, welcher controller zuerst eingeschaltet wurde (vor dem starten des spiels).

eine liste zu führen und abzuspeichern würde wenig sinn machen, da sich einiges hardwaretechnisch geändert haben könnte, seit das spiel das letzte mal gestartet wurde. der user könnte den controller bereits weggeschmissen haben und ich würde ihn nur unnötig in der liste mitführen.

soweit ich weiss, klappt es bei directinput auch mit der reihenfolgenerkennung. daher denke ich schon dass windows intern bereits eine liste aktiver geräte führt. ich hab auch einiges mit wmi rumprobiert, doch leider ohne erfolg. hab auch absolut keine ideen mehr, was ich noch machen könnte.
Ch4vy
 
Beiträge: 2
Registriert: 19.09.2017, 12:11

Re: RawInput Joypad Reihenfolge

Beitragvon Krishty » 25.09.2017, 20:26

Ch4vy hat geschrieben:soweit ich weiss, klappt es bei directinput auch mit der reihenfolgenerkennung. daher denke ich schon dass windows intern bereits eine liste aktiver geräte führt. ich hab auch einiges mit wmi rumprobiert, doch leider ohne erfolg. hab auch absolut keine ideen mehr, was ich noch machen könnte.
Ich habe leider überhaupt keine Erfahrung mit DirectInput mit der Reihenfolge, aber ein weiterer Ansatzpunkt: DirectInput speichert alle möglichen Sachen in der Registry. Bau eine Dummy-Anwendung, in der die Enumeration erfolgreich funktioniert. Nutz dann den Process Monitor, um alle Registry-Aufrufe aufzulisten. So findet man bisweilen recht schnell, wo DInput was speichert.

Ch4vy hat geschrieben:eine liste zu führen und abzuspeichern würde wenig sinn machen, da sich einiges hardwaretechnisch geändert haben könnte, seit das spiel das letzte mal gestartet wurde. der user könnte den controller bereits weggeschmissen haben und ich würde ihn nur unnötig in der liste mitführen.
Windows macht’s ganz genau so; alle machen es eigentlich so. Es würde mich wundern, wenn DirectInput es anders macht. Aber das ist deine Entscheidung …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5973
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: RawInput Joypad Reihenfolge

Beitragvon NytroX » 28.09.2017, 17:53

Macht euch doch das Leben nicht so schwer... :D

Normalerweise machen Spiele, die Joypad-unterstützung haben, ein "Press start to continue" am Anfang.
Der Controller, der das drückt, ist Controller 1/Player 1. (Oder wahlweise der, der im Startmenü zuerst bedient wird)
Wenn andere Player joinen, genauso. Ein "Press start to join", und die Reihenfolge steht fest :-)

Das hat den Vorteil, dass wenn man mehrere Controller ständig angeschlossen hat und alleine spielt, man nicht rumprobieren muss, welcher der Player1-Controller ist - sondern es geht einfach, egal mit welchem.
Und leicht zu implementieren ist es auch - man muss erstmal nix zwischenspeichern.

Wenn man ein komplexeres Game hat, macht jeder Spieler beim Start der Kampagne (oder sowas...) einfach ein Profil - und nach einem Neustart kann jeder sein Profil auswählen - d.h. jeder kann an jedem Joypad spielen;
dann gibts auch kein Gefrickel am 2. Abend der Zocker-Runde, weil jeder sein Joypad von gestern sucht - oder irgendwie die Plätze getauscht wurden und ein Kabel jetzt zu kurz ist :mrgreen:
NytroX
 
Beiträge: 129
Registriert: 03.10.2003, 12:47

Re: RawInput Joypad Reihenfolge

Beitragvon Schrompf » 29.09.2017, 12:37

Außer dass manche USB-Geräte irgendwelche Pins auf Dauersendung haben. Ich hatte genau das bei Splatter eingebaut und habe gelegentliche Fehlerberichte bekommen, dass sofort ein "Controller detected" kam, obwohl der Nutzer keinen angeschlossen hatte. Was für ein Elend.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3603
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: RawInput Joypad Reihenfolge

Beitragvon Krishty » 29.09.2017, 12:57

Hmm … sicher, dass das mit dem Problem zu tun hat?

Ich habe hier beide Arten von Geräten:

Was du mit Dauersendung meinst: Mein PSX-Controller schickt 30 Mal pro Sekunde seinen kompletten Zustand. Egal, ob sich was ändert oder nicht. Nervig, weil man eben die Deltas speichern und vergleichen muss, um z.B. zu erfahren, ob gerade etwas gedrückt wurde. (Ich bin mir auch recht sicher, dass Aktionen verloren gehen, die weniger als eine 30stelsekunde dauern.)

Dann habe ich noch einen Joystick, der erst sendet, wenn sich was bewegt. Das ist ein Problem, denn wenn z.B. der Schubhebel bei Programmstart auf 100 % steht, kriegt das Programm das nicht mit. Erst, wenn man zum ersten Mal was ändert (typischerweise den Joystick antickt) kommt ein Report, und dann springt der Schubhebel „magisch“ auf die 100 %, auf denen er eigentlich vorher schon hätte stehen sollen.

Beide werden aber grundsätzlich direkt bei Anschluss erkannt (nicht erst nach 30stelsekunde/bei erster Bewegung) und keiner von beiden hat jemals eine gedrückte Taste gemeldet, wenn sie nicht wirklich physisch gedrückt war. Wo ist dann das Problem für den OP?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
 
Beiträge: 5973
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast

cron