HTML5 Gamepad-API in Chrome

8

Ich verwende Chrome (Version 19.0.1084.46). Ich habe die Gamepad-API in chrome: // flags aktiviert. Ich habe einige Game-Pads angeschlossen, aber navigator.webkitGamepads ist immer ein Array der Länge 4, das nur undefined enthält.

%Vor%

Was muss ich tun, um Gamepads zu testen? Ich bin auf Ubuntu Linux, wenn das wichtig ist.

    
Daniel X Moore 31.05.2012, 18:37
quelle

3 Antworten

7

Ich hatte auch Probleme damit (auf Ubuntu 10.04 mit Chrome 21.0.1163.0 dev). Ich stieß auf diese Frage von einem Thread über Chrom-Diskussionen :

  

Beachten Sie, dass Sie vor den Daten eine Gesichtstaste auf dem Gamepad drücken müssen   wird verfügbar sein. Dies ist auf Bedenken wegen Fingerabdrücken zurückzuführen.

Ich habe eine schnelle Testseite geschrieben, die zu funktionieren scheint, wenn Sie beim Aktualisieren der Seite eine Controller-Taste gedrückt halten. Ich verwende einen Gamestop-Xbox 360-Kabelcontroller mit dem xboxdrv-Treiber.

Auch eine weitere wichtige Anmerkung: Chrome behandelt diese Gamepad-Objekte wie Snapshots des Controller-Status. Wenn Sie also das eigentliche Gamepad-Objekt weitergeben, werden Sie nie aktualisierte Informationen erhalten. Chrome scheint nur den Controller abzufragen, wenn Sie% code% getter aufrufen (siehe Zeile 23 auf meiner Testseite).

    
Matt 07.06.2012, 21:36
quelle
1

SPEZIELLER HINWEIS: Die GamePad-API wird auf zwei vollständig verschiedene Arten von Firefox und Google Chrome gehandhabt. Aus diesem Grund müssen Sie Code zum Testen der Identität Ihres Browsers hinzufügen und die Fälle entsprechend behandeln.

Wenn die Methode navigator.getGamePads () aufgerufen wird, wird ein Array von Objekten zurückgegeben, und diese Objekte enthalten Informationen über die Identität Ihrer Gamepads / Joysticks und den Status ihrer Achsen / Schaltflächen.

Hier ist das Problem: In Firefox übergibt die Methode das Array an Ihren aufrufenden Code, und Sie können dieses Array dann wiederholt untersuchen, um nach Änderungen des Achsen- / Schaltflächenstatus in Ihrem eigenen Code zu suchen. Firefox verhält sich wie erwartet und aktualisiert die Objekte, die Sie erhalten haben, mit neuen Achsen- / Knopfdaten, sobald diese verfügbar sind.

Google Chrome hingegen behandelt das Array total anders. Chrome behandelt das Array als einmaligen Snapshot des Status Ihrer Gamepads / Joysticks. Wenn Sie neue Daten abrufen möchten, müssen Sie einen anderen Aufruf des Navigators ausführen .getGamePads (), um einen neuen Snapshot abzurufen und den alten Snapshot zu verwerfen.

Als Konsequenz benötigen Sie so etwas, damit Ihr Code in beiden Browsern funktioniert (vorausgesetzt, die Variable 'gp' ist die Variable, in der Sie den Rückgabewert des ersten Aufrufs von navigator.getGamePads () gespeichert haben). ..)

%Vor%

Warum sich die beiden Browser so unterschiedlich verhalten, ist ein Thema für einen anderen Thread, aber ich vermute, dass es viel damit zu tun hat, dass die GamePad-API noch etwas experimentell ist und die feinen Details des dafür geltenden Standards noch nicht vorliegen wurde abgeschlossen.

In meinem Fall läuft Chrome unter Windows 7 64-Bit (aber die 32-Bit-Version, aus irgendeinem seltsamen Grund, der meinem Computerhersteller am besten bekannt ist, der es auf diese Weise installiert hat), das von navigator.getGamePads ( ) enthält derzeit nur so viele Einträge wie tatsächlich Gamepads / Joysticks an meinen Computer angeschlossen sind. Wenn Sie in Chrome unter Linux etwas anderes erleben, müssen Sie dies ebenfalls berücksichtigen, indem Sie testen, ob Sie im Array NULL-Werte haben.

Ein weiterer zu berücksichtigender Faktor ist, dass der Standard bei der Auswahl eines Gamepads / Joysticks die Eigenschaft index des GamePad-Objekts aufruft, auf die verwiesen wird, und danach zur Indizierung in das Array. Der Grund dafür wird in diesem Dokument ausführlicher behandelt:

W3C-Seite: Editor's Draft auf der GamePad-Oberfläche

Obwohl die Implementierung des oben beschriebenen Verfahrens in meiner Version von Google Chrome funktioniert, müssen Sie Ihre Version möglicherweise experimentell überprüfen, um festzustellen, ob sie sich genauso verhält wie meine Version. Wenn dies nicht der Fall ist, passen Sie Ihren Code entsprechend an, bis der Standard fertiggestellt ist, und die entsprechende Konformität wird in allen modernen Browsern und allen Betriebssystemen davon durchgesetzt.

Wenn Sie also ein bestimmtes Gamepad / einen Joystick zum Arbeiten auswählen, sieht der Code ungefähr so ​​aus (mit der Variable 'gid' als Indexselektor):

%Vor%

Ich habe den obigen Code (zusammen mit einigen Aufräumarbeiten am Ende) tatsächlich als Methode für ein benutzerdefiniertes Objekt implementiert, aber das Prinzip bleibt unabhängig von den Implementierungsdetails unverändert. (Ich gestehe an dieser Stelle, dass ich die Gewohnheit habe, meine eigenen kurzen Bibliotheken zu schreiben, um solche Aufgaben zu bewältigen!)

Ein weiteres Problem, auf das Sie achten sollten, ist die Art und Weise, in der die Gamepad-API die physischen Datenquellen Ihres Gamepads / Joysticks den Achsen- / Schaltflächenelementen des GamePad-Objekts und den darin enthaltenen Werten zuordnet. Ich habe einen Microsoft Sidewinder Pro USB-Joystick, und die Zuordnungen für dieses Gerät auf meinem Computer sind ernsthaft seltsam, nämlich:

  • Achsen 0/1: Joystick-Griff (wie erwartet)
  • Achsen 2/3: Nicht zugewiesen
  • Achsen 4/5: 4 nicht zugewiesen, 5 Drehgriff zugewiesen
  • Achsen 6/7: 6 sind dem runden Schieber zugeordnet, 7 nicht zugewiesen
  • Äxte 8/9: 8 nicht zugewiesen, 9 zugewiesen zu Schalter (äh, WAS ???)

Ja, das stimmt, die analoge Achse 9 wird dem Hutschalter zugewiesen, und es werden ernsthafte ungerade Werte zurückgegeben, nämlich:

  • Hutschalter zentriert: +1.2
  • Hat Switch: -1.0
  • Hut runter: +0.1
  • Hat Schalter links: +0.7
  • Hut switch right: -0.42

Quirks wie diese sollten Sie beim Experimentieren mit der GamePad-API beachten. Schlimmer noch, ein sogenanntes "Standard" GamePad (definiert in dem Dokument, mit dem ich oben verlinkt bin) kann in einigen Browsern als Standard angezeigt werden, aber nicht in anderen, oder schlimmer noch, als Standard in Browser X in Windows, aber nicht in Windows der gleiche Browser X in Linux!Während dies viel Frustration hervorruft, während Sie versuchen, sich durch dieses Software-Äquivalent von Brombeersträuchern hindurchzukämpfen, wobei einige der Dornen auf dem Weg stark zerkratzt werden, können Sie zumindest Trost darin finden, dass Browser-Entwickler are arbeitet daran, dies zu verbessern und zu verbessern, aber es wird Zeit brauchen, weil andere Dinge Priorität haben (z. B. um sicherzustellen, dass dein Browser kein einfaches Ziel für Ransomware wird, was dir den Tag ruiniert) stark> immens wenn es passiert).

    
David Edwards 27.07.2017 04:29
quelle
0

Das hat nicht für mich funktioniert, aber vielleicht hilft es dir? Gezogen von hier .

%Vor%

Oder als eine harte Alternative gibt es das Javascript Joystick Plug-in ( Demo hier ), aber ich glaube nicht, dass das unter Linux funktioniert.

    
Silviu-Marian 01.06.2012 03:31
quelle