概要
XInput は、Microsoft が提供する、Xbox 360 コントローラー専用のAPIである。
最大4つのコントローラーを利用出来る。
WinMain 関数で始まるWindowsプログラミングで無くても、利用可能である。
初期化すら必要なく、とてもシンプルで使いやすい。
セットアップ
- Microsoft DirectX SDK (June 2010) をインストールする。(最新バージョンでも可能と思われるが未確認)
- Visual Studio で 「Visual C++」 で任意のプロジェクト(例:空のプロジェクト)を作成する。
- 任意の C++ ソースファイルを追加する。
- 任意のメインループを作成する。
例:
void main() {
while(1) {
}
}
|
コントローラーの状態の取得
- ヘッダーをインクルードする。
Windows.h は、XInput の利用に必要。
#include <Windows.h>
#include <Xinput.h>
|
- xinput.lib をインポートする。
#pragma comment (lib, "xinput.lib")
|
- XINPUT_STATE 構造体のインスタンスを作成する。
- 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)