Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Xinput、DirectInput両対応のPlayStation4互換コントローラ - USB接続でXInput、Bluetooth接続でDirectInput

Windows 10でゲーム・コントローラを使用する場合、2種類のAPIのいずれかが適用される。DirectInputと、XInputだ。

Windowsコントローラとして販売されているものの中には、他社ゲーム機との互換性を有するものがある。PlayStationとの互換性が明記されていながら、Xboxとの互換性が併記されていない場合、そのコントローラはDirectInputにだけ対応している可能性が高い。
PCゲーム用のコントローラを選ぶ場合、両方に対応しているものを選ぶのが理想的だが、どちらか一方であればXInput対応コントローラを選ぶのが安全だ。制約付きながら、XInputコントローラは、DirectInputでも動作する。

偶然にも面白い仕掛けのコントローラを見つけた。USBで接続するとXInput、Bluetoothで接続するとDirectInputで動作するコントローラだ。
今回の投稿では、このコントローラの紹介と合わせて、XInputの制約を説明する。

XInputとDirectInput

両者の特徴的な違いをまとめると、次のようになる。

Direct Input 古い DirectX Sony PlayStation
Nintendo Switch
XInput 新しい Xbox 360 Windows Storeアプリ対応

DirectInputDirectXに含まれるAPIで、Windows環境では標準的に用いられる技術だ。PlayStationNintendo Switchのコントローラ、その互換製品をWindowsで用いる場合にも、DirectInputで動作する。

XInputはXbox系統のAPIで、Windowsでの新標準でもある。コントローラをWindowsに接続した際、Xboxコントローラとして認識された場合は、こちらの技術で動作している。一般的なコントローラ・アイコンとして認識されている場合は、DirectInputだ。

どちらも一般的なWindowsゲームで利用される技術ではあるのだが、Windows Storeアプリとして提供されているゲームでは、DirectInputで動作するコントローラを使用することはできない。
Steamのように、ソフトウェアで両方に対応している場合もあるのだが、これは例外的な事例だ。

DirectInputにおける、XInputコントローラの制約

XInputコントローラはDirectInputにも対応しているので、古いゲームの操作用に用いることもできる。ただし制約付きだ。具体的には、

  1. 単一系統での左右トリガー・ボタン(L下、R下)入力
  2. バイブレーションが動作しない可能性
  3. コントローラ経由の音声入出力(イヤホン、ヘッドセット)が動作しない可能性

1の詳細は、コントローラの紹介で触れる。

面白い仕掛けのコントローラ

今回紹介するコントローラがこれだ。意図的なのか、誤りなのか分からないが、Amazonの商品説明は、実際の動作とは異なっている。次のように機能する。

Bluetooth接続時

Wireless Controllerとして認識され、DirectInputで動作する。14のボタンが認識されているが、左右トリガー・ボタンがボタンとXY軸操作を兼ねている。

L下 ボタン7 X Rotation
R下 ボタン8 Y Rotation
右スティック(横) Z axis
右スティック(縦) Z Rotation
USB接続時

Xbox 360コントローラとして認識され、X-Inputで動作する。10のボタンが認識されているが、ここに左右トリガー・ボタンは含まれない。両ボタンで単一のZ軸操作に割り当てられている。Bluetooth接続時の右スティック(横)が、両トリガーでのアナログ入力に置き換えられたということだ。

L下 Z axis
R下 Z axis
右スティック(横) X Rotation
右スティック(縦) Y Rotation

DirectInputにおける、XInputコントローラの制約」で触れた制約、「単一系統での左右トリガー・ボタン(L下、R下)入力」がZ軸操作に反映されているのが分かる。例えば、左トリガーでズームイン、右トリガーでズームアウト、といった奥行き操作に該当する。
またDirectInputでは対応可能だったZ軸回転は、このコントローラでは対応することができないことも分かる。