キーボードのキーコード(DIK_〜)はあらかじめDirectInputに定義されているが、ジョイパッドのキーコードは定義されていない。そのため、自作のキーコードを作り、それをNKC_DInput.hに宣言してある。
//----------------------------------------------------------------------------- // Joypad情報用マクロ //----------------------------------------------------------------------------- #define BUTTON_UP 0x00000001l //方向キー上(dijs.IY<0) #define BUTTON_DOWN 0x00000002l //方向キー下(dijs.IY>0) #define BUTTON_LEFT 0x00000004l //方向キー左(dijs.IX<0) #define BUTTON_RIGHT 0x00000008l //方向キー右(dijs.IX>0) #define BUTTON_A 0x00000010l //Aボタン(dijs.rgbButtons[0]&0x80) #define BUTTON_B 0x00000020l //Bボタン(dijs.rgbButtons[1]&0x80) #define BUTTON_C 0x00000040l //Cボタン(dijs.rgbButtons[2]&0x80) #define BUTTON_X 0x00000080l //Xボタン(dijs.rgbButtons[3]&0x80) #define BUTTON_Y 0x00000100l //Yボタン(dijs.rgbButtons[4]&0x80) #define BUTTON_Z 0x00000200l //Zボタン(dijs.rgbButtons[5]&0x80) #define BUTTON_L 0x00000400l //Lボタン(dijs.rgbButtons[6]&0x80) #define BUTTON_R 0x00000800l //Rボタン(dijs.rgbButtons[7]&0x80) #define BUTTON_START 0x00001000l //STARTボタン(dijs.rgbButtons[8]&0x80) #define BUTTON_M 0x00002000l //Mボタン(dijs.rgbButtons[9]&0x80)
ジョイパッドの情報を取得するには、まずジョイパッドデバイスを設定する必要がある。これは、DirectInputの初期化(WinMain.cpp内)のあとに、次のように指定する。
//-------------------------------------------------------------------------------------------------
// メイン関数(エントリーポイント)プログラムはここから始まる
//-------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
・
・
・
// DirectInputオブジェクトの初期化
if (FAILED(InitDInput(hThisInst))) return (FALSE);
// Keyboard Object の初期化
if (FAILED(InitKeyboard())) return (FALSE);
// Joypad Object の初期化
if ( FAILED(InitJoypad()) ) OutputDebugString("Joypad Not Found\n");
・
・
・
}
ジョイパッドの各ボタンが押されているかどうかを取得する前に、ジョイパッドが存在するかどうかを調べ、存在しなければ処理を行わないようにしなければならない。ジョイパッドが存在するかどうかは、ジョイパッドデバイスが作成されたかどうかで調べることができる。
// ジョイパッドがない場合、それ以降の処理を行わない
if ( FAILED(g_diJoyState) ) return;
上記if文でreturnにならなかった場合、ジョイパッドデバイスが正常に作成されているので、各ボタンの情報(押されているか押されていないか)を取得できる。
ジョイパッドのどのボタンが押されているかを格納する変数はNKC_DInput.cppですでに用意してある。取得したいところでGetJoypadState()という関数を実行すると、状態を取得し、変数に情報を格納する。
//-----------------------------------------------------------------------------
// 関数名 : UpdateFrame()
// 機能概要: ゲームメイン処理
//-----------------------------------------------------------------------------
void UpdateFrame(void)
{
/* 現在の時間を取得 */
gl_nowTime = timeGetTime();
/* キーボードの状態を取得 */
GetKeyboardState();
// ジョイパッドの状態を取得
GetJoypadState();
・
・
・
}
調べたいボタンが押されているかどうかは次のように判断する。
// カーソルキーの左が押されているかどうかを調べる
if ( g_diJoyState & BUTTON_LEFT ) {
// 押されているときの処理
} else {
// 押されていないときの処理
}
| BACK(キーボードの状態を取得する) | NEXT(マウスの状態を取得する) |