2022年8月11日木曜日

XInput

DirectX11用のライブラリを作ったとき、DirectInputでコントローラを使えるようにした。
DirectX12用のライブラリではこれは捨てて、新しくXInputを採用することにした。

初期化


DirectInputの時はDirectInput8Createで初期化して、CreateDevice、SetDataFormat、SetCooperativeLevel、Acquire、Pollとこれだけの関数を呼び出してやっと使えた。
CreateDeviceをすることによりキーボード、マウス、コントローラを同じように扱える。

XInputではどうなるか調べたら、初期化関数に当たるものがなかった。
インクルードファイルと、リンクライブラリはこれ。

#include <xinput.h>
#pragma comment (lib, "xinput.lib")

状態取得


状態取得関数は、XInputGetState
これにコントローラの番号とXINPUT_STATEを渡す。
取得できたら、XINPUT_GAMEPADの中に結果が返る。

コントローラの番号は0~XUSER_MAX_COUNT-1まで渡せる。
XUSER_MAX_COUNTは4で定義されているので最大4つまで認識できる。

 wButtons


下記マクロでボタンのOn/Off状態が取得できる。
  • XINPUT_GAMEPAD_DPAD_UP
  • XINPUT_GAMEPAD_DPAD_DOWN
  • XINPUT_GAMEPAD_DPAD_LEFT
  • XINPUT_GAMEPAD_DPAD_RIGHT
  • XINPUT_GAMEPAD_START
  • XINPUT_GAMEPAD_BACK
  • XINPUT_GAMEPAD_LEFT_THUMB
  • XINPUT_GAMEPAD_RIGHT_THUMB
  • XINPUT_GAMEPAD_LEFT_SHOULDER
  • XINPUT_GAMEPAD_RIGHT_SHOULDER
  • XINPUT_GAMEPAD_A
  • XINPUT_GAMEPAD_B
  • XINPUT_GAMEPAD_X
  • XINPUT_GAMEPAD_Y

bLeftTrigger、bRightTrigger


トリガーボタンの押し込み状態が0~255で取得できる。
ただし、そのまま使わずXINPUT_GAMEPAD_TRIGGER_THRESHOLD未満の値は捨てて0扱いにする。

sThumbLX、sThumbLY


左スティックの状態が-32768~32767で取得できる。
ただし、そのまま使わず絶対値でXINPUT_GAMEPAD_LEFT_THUMB_DEADZONE未満の値は捨てて0扱いにする。

sThumbRX、sThumbRY


右スティックの状態が-32768~32767で取得できる。
ただし、そのまま使わず絶対値でXINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE未満の値は捨てて0扱いにする。

バイブレーション


振動の設定はXINPUT_VIBRATIONのwLeftMotorSpeedとwRightMotorSpeedに0~65535の値を設定して、XInputSetState関数を呼び出す。


その他


XInputEnable


falseを渡すと、コントローラの状態がすべてニュートラルの状態で返却されるようになる。
アクティブ画面でない場合など、コントローラを効かなくする場合に使うかも。
ただ、false状態にするとXInputSetStateも受け付けなくなるので、もし振動状態ならリセットしてからfalseにしないと振動しっぱなしになる。

XInputGetKeystroke


1つのボタン単位で状態を取得できる。状態もOn/Offのみでなく、押された瞬間、押しっぱなし、離した瞬間が判る。
ボタンの指定は「VK_PAD_」から始まるマクロが用意されている。
自分で前回のState状態を保持するようにするのでこの関数は使わないかな。

キーボードとのマッピング


直接状態を参照するとキーボードとコントローラを両方対応する場合に面倒になるため1枚レイヤを噛ませて、キーのマッピング情報を用意してプログラムからは透過的に使えるようにする。
キーボードの状態はGetKeybordStateでまとめて取得する。

アナログの値


トリガーとスティックの値はそれぞれの最大値がありそのままでは使いづらい。
最大値で割って0~1の範囲で使えるようにする。この時それぞれのデッドゾーンがあり、あるところからいきなり値が発生するので、デッドゾーンを超えたところから最大値までの範囲で補間する。

0 件のコメント:

コメントを投稿