XInput


概要

XInput は、Microsoft が提供する、Xbox 360 コントローラー専用のAPIである。
最大4つのコントローラーを利用出来る。
WinMain 関数で始まるWindowsプログラミングで無くても、利用可能である。
初期化すら必要なく、とてもシンプルで使いやすい。

セットアップ

  1. Microsoft DirectX SDK (June 2010) をインストールする。(最新バージョンでも可能と思われるが未確認)
  2. Visual Studio で 「Visual C++」 で任意のプロジェクト(例:空のプロジェクト)を作成する。
  3. 任意の C++ ソースファイルを追加する。
  4. 任意のメインループを作成する。
    例:
    void main() {
        while(1) {
        }
    }

コントローラーの状態の取得

  1. ヘッダーをインクルードする。
    Windows.h は、XInput の利用に必要。
    #include <Windows.h>
    #include <Xinput.h>
  2. xinput.lib をインポートする。
    #pragma comment (lib, "xinput.lib")
  3. XINPUT_STATE 構造体のインスタンスを作成する。
    XINPUT_STATE state;
  4. XInputGetState 関数で、コントローラーの状態を取得する。
    XInputGetState(
        0,       // DWORD         dwUserIndex
        &state); // XINPUT_STATE* pState
    dwUserIndex には、コントローラーの番号を 0~3 で指定する。
    pState には、コントローラーの状態の格納先の XINPUT_STATE 構造体のポインタを渡す。
    XInputGetState 関数の戻り値が ERROR_SUCCESS であれば成功で、コントローラーが接続されてなければ失敗する。

コントローラーの状態の分析

XInputGetState 関数で取得した XINPUT_STATE 構造体は、次のように定義されている。
typedef struct _XINPUT_STATE
{
    DWORD                               dwPacketNumber;
    XINPUT_GAMEPAD                      Gamepad;
} XINPUT_STATE, *PXINPUT_STATE;
Gamepad に、ゲームパッドの状態が格納される。

XINPUT_STATE 構造体のメンバーの XINPUT_GAMEPAD 構造体は、次のように定義されている。
typedef struct _XINPUT_GAMEPAD
{
    WORD                                wButtons;
    BYTE                                bLeftTrigger;
    BYTE                                bRightTrigger;
    SHORT                               sThumbLX;
    SHORT                               sThumbLY;
    SHORT                               sThumbRX;
    SHORT                               sThumbRY;
} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;

XINPUT_GAMEPAD 構造体のメンバーについては次のとおり。
変数名 内容 範囲
WORD wButtons ボタンマスク(各ボタンのオン/オフ、詳細は後述)
BYTE bLeftTrigger 左トリガー 0~255
BYTE bRightTrigger 右トリガー
SHORT sThumbLX 左アナログスティックの横軸 -32768~32767
SHORT sThumbLY 左アナログスティックの縦軸
SHORT sThumbRX 右アナログスティックの横軸
SHORT sThumbRY 右アナログスティックの縦軸

ボタンマスク

ボタンマスクの定数が次のように定義されている。
各ボタンのオン/オフが、XINPUT_GAMEPAD 構造体の wButtons 変数に、下位から順に各ビットのオン/オフで格納される。
#define XINPUT_GAMEPAD_DPAD_UP          0x0001
#define XINPUT_GAMEPAD_DPAD_DOWN        0x0002
#define XINPUT_GAMEPAD_DPAD_LEFT        0x0004
#define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008
#define XINPUT_GAMEPAD_START            0x0010
#define XINPUT_GAMEPAD_BACK             0x0020
#define XINPUT_GAMEPAD_LEFT_THUMB       0x0040
#define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080
#define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100
#define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200
#define XINPUT_GAMEPAD_A                0x1000
#define XINPUT_GAMEPAD_B                0x2000
#define XINPUT_GAMEPAD_X                0x4000
#define XINPUT_GAMEPAD_Y                0x8000

バイブレーション

コントローラーの左右のバイブレーションを、強度を指定して設定可能である。

XINPUT_VIBRATION 構造体のインスタンスを定義する。
XINPUT_VIBRATION vibration;

XINPUT_VIBRATION 構造体は次のように定義されている。
typedef struct _XINPUT_VIBRATION
{
    WORD                                wLeftMotorSpeed;
    WORD                                wRightMotorSpeed;
} XINPUT_VIBRATION, *PXINPUT_VIBRATION;

XINPUT_VIBRATION 構造体のメンバーについては次のとおり。
変数名 内容 範囲
WORD wLeftMotorSpeed 左モーターの強度 0~65535
WORD wRightMotorSpeed右モーターの強度

終了処理

バイブレーションを利用する場合、そのままではプログラムが終了しても振動し続けてしまう。
それを回避する為に、プログラム終了前に、XInput を無効にする必要がある。
次の例は、XInput を無効にする。
XInputEnable(false); // BOOL enable

© GPU (Game Programming Unit) <script><!-- var fc2footerparam = 'charset=' + encodeURIComponent(document.charset ? document.charset : document.characterSet) + '&url=' + encodeURIComponent(document.location) + '&service=0&r=' + Math.floor(Math.random()*99999999999); var fc2footertag = "//vip.chps-api.fc2.com/apis/footer/?" + fc2footerparam; var script = document.createElement('script'); script.src = fc2footertag; script.charset = "UTF-8"; script.async = true; document.getElementsByTagName('head')[0].appendChild(script); //--></script> <!-- FC2, inc.--> <img src="//media.fc2.com/counter_img.php?id=50" style="visibility:hidden" alt="inserted by FC2 system" width="0" height="0"> <!-- FC2, inc.-->