Seaside Laboratory

Posts

DirectInput 対応アプリケーションと XInput の関係

持っているアケコンが古くなったのと、XInput の挙動を調査したかったので XInput 対応したアケコンを購入。

ホリ製リアルアーケード Pro.N HAYABUSA。
以前使っていたシグマ電子の 9000TB というアーケード基板用のコントローラー。

PS4 も Xbox も持っていない状況で購入に踏み切れたのはマイクロソフトのサイトに、

Xbox 360 コントローラーは、DirectInput で適切に列挙され、DirectInput API で使用できます。

と書かれていたのが大きい。DirectInput に対応しているということは今までに作られた Windows 用ゲームで使え、さらに近年の XInput 対応ゲームや PS4 でも使えるということなので悪い買い物ではない。

Windows 上での認識

コントローラーを USB に挿してゲームを起動してみるも認識されず。手動でのドライバインストールが必要なのかと思い色々調べた後、再びデバイスマネージャーを見ると "XBOX 360 Controller For Windows" というデバイスが列挙されていた。どうやらドライバのインストールに時間がかかっていたらしい。

早速、XInput コントローラーが DirectInput からどう見えているのか調べてみた。

Xbox コントローラー DirectInput ボタン番号
START 8
BACK 7
LSB 9
RSB 10
LB 5
RB 6
A 1
B 2
X 3
Y 4
LT なし
RT なし

LT と RT が正常に動作しない理由は XInput のプログラミングガイドに書かれている。

以下のように XInput で実現されている一部の機能は、DirectInput では実装されません。

・個々に動作していた左右のトリガーボタンは、1 つのボタンとして動作するようになります。
・バイブレーションエフェクトは使用できなくなります。
・ヘッドセットデバイスへのクエリが使用できなくなります。

DirectInput の左右のトリガーの組み合わせは、意図的なものです。ゲームでは、DirectInput デバイスとユーザーとの対話操作がない場合、このデバイスの軸は常に中央に配置されると想定しています。ただし、トリガーが保持されない場合、Xbox 360 コントローラーは中心ではなく最小値を登録するように設計されていました。したがって、以前のゲームはユーザーの対話操作を想定しています。

この解決策とは、トリガーを組み合わせて、あるトリガーを正の方向に設定し、もう 1 つのトリガーを負の方向に設定するというものでした。それによって、DirectInput に制御が中央にあることをユーザーの対話操作で示すことがなくなります。

この説明を読んでも意味が分からなかったので調べてみると、LT と RT は 1 つのアナログ軸として認識され、トリガーを押すと Z 軸が正または負の方向へ変化するので、それを元にどちらのトリガーが押されたのか判別することができるが、左右のトリガーを同時に押すと Z 軸の移動量が相殺されてしまい、押していない状態と区別がつかなくなる、ということだった。

XInput の内部表現とボタン名称の違い

XInput で使用する各ボタンには "XINPUT_GAMEPAD_~" という定数が割り当てられているが、この定数名は実際のボタン名と微妙に違っていて分かりづらい。

LEFT_SHOULDER と RIGHT_SHOULDER

オンライン上にある Xbox のマニュアルを見ても "SHOULDER" なんていう文字はどこにも書かれていない。調べてみると「LB ボタン」と「RB ボタン」を指しているものだと分かった。英語版のマニュアルを見ても "Left bumper" と "Right bumper" と書かれているだけ。

LEFT_THUMB と RIGHT_THUMB

これも "SHOULDER" と同様にマニュアルと表記が違っていて、それぞれ「左スティック」と「右スティック」のことを指していた。英語版は "Left stick" と "Right stick" なので "THUMB" なんて文字は出てこない。

さらに謎だったのがボタン定数なのにスティックだということ。通常、スティックは X 軸と Y 軸を持つ 2 次元のデータなのでボタンとは扱いが異なる。調べてみるとスティックではあるが奥に押し込むことができるとのこと。ううむ…。

LT と RT を有効にする方法

普段あまり使わないような端っこのボタンならともかく、RAP での RT はストリートファイター配置でいう強キックに相当するボタンなので、これが使えないのは結構痛い。

そこで、LT と RT を有効化する方法についてまとめておく。

XInput Plus

XInput 関連の調べものをしていると度々出てくるのが XInput Plus というツール。

XInput Plus は、公式ドライバを使用し、XInput に対応したゲームで動作します。乱暴に説明すると、公式ドライバでの入力状態とゲームの間に割り込み、入力状態を加工してゲームに渡すことで、各種機能を実現しています。

DirectInput 形式での使用時には、DirectInput 出力機能により、XInput の出力を DirectInput に変換出力することで対応しています。

トリガーを DirectInput のボタンとして再割り当てをすることで使えるようにする、ということらしい。

RAP のアサインモード機能

RAP には特定のボタンに別のボタンを割り当てる機能が搭載されている。

アサインモードスイッチを切り替えることで、L1、L2、OPTIONS(START) ボタンのそれぞれに他のボタンの機能を割り当てる、もしくは無効にすることができます。

上位モデルの「ファイティングエッジ刃」と違い、リアルアーケード Pro.N は LT と RT に再割り当てすることができなかった、残念。