趣味でゲームパッドを扱うプログラムをPythonで書いているのですが、改めて調べているとWindows向けのゲームコントローラーはXBOXのコントローラーがデファクトスタンダードの様になっているようです。従来のゲームパッドはボタン数もレイアウトもコントローラー毎に異なっているので、標準となるコントローラーがあると都合が良いというのは理解できます。そして気になるのが、XBOXのコントローラーはXInputと呼ばれる方式(API)が採用されており、昔ながらのゲームパッドはDirect Inputと呼ばれる方式であるという点です。
私はDirect Inputのゲームパッドしか持っていなかったのですが、プログラムを作る立場としてはXInputのゲームパッドもとりあえず購入して動作確認をするべきだろうということで、色々検討した結果 EasySMX EG-C3071有線ゲームコントローラーというのを買いました。XBOXの公式コントローラーではなくこちらの製品を購入した理由は、XInputのモードとDirect Inputのモードを切り替えて使えるので、XInputが使えなかった場合でも最悪ゴミにはならないだろうと思ったからです。あと値段が安かったからです。
このコントローラーはPCに刺すとPCモード、PS3に刺すとPS3モード、Android に刺すとAndroidに刺すとAndroidモードで動作するらしいです。で、Windows上では刺した直後はXInputのモードで動作しますが、真ん中のHOMEボタンを5秒長押しすることでDirect Inputのモードに切り替えることができます。さらに、Direct InputのモードではHOMEボタンを(短く)押すことでさらにスティックの挙動がことなるDigitalモードに切り替えられます。どのモードで動作しているかはコントローラ下部のLEDで確認できます。
と、いう訳で。自分のプログラムで動作させるために、各モードでどのボタンが何番目のボタンとしてPCが認識するのかを調査しました。
↑これがXInputモードです。XInput対応のコントローラーであれば、これと全く同じボタン配置で、10ボタン、5アナログ軸のコントローラーとして使えるはずです。ちなみに、PythonのPygameライブラリではXInputとDirect Inputの違いを内部で吸収してくれていて、とくに意識せずに同じAPIを用いて使用することができました。
PS3/PCモード。PS3のコントローラとの互換性のためだと思いますが、XInputモードとはところどころ異なります。RLのトリガー(RT/LT)がアナログ入力ではなくデジタル入力扱いになりました。HOMEボタンが12番として入力を検知できますが、押すとこのコントローラーのモードが切り替わってしまいます・・・。
PS2/PC Digitalモード。十字キーと左スティックの入力が入れ替わり、右スティックがボタン入力になりました。
Windowsでの調査結果は以上ですが、Linux(UbuntuおよびRaspbian)にこのゲームパッドを接続したところ、Androidモード(!)として動作したので、その入力も調査しました。(個人的に、LiniuxでもPCモードでの動作を期待していたけど・・・)
なぜか15ボタン扱いで、2、5、12のボタンが存在しない・・・?Androidの標準的なコントローラー(?)との互換性の関係でしょうか?SHANWAN Android Gamepadという名前で認識されるところに秘密がありそうですが、深く考えずに調査を終了します。
余談ですが、Amazonのページには連射機能搭載って書いてある気がするけど、無いよね?