ジョイパッドの状態を取得する

前準備

キーボードのキーコード(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");
    ・
    ・
    ・
}

《POINT》

ジョイパッドが接続されているかどうかを確認する

ジョイパッドの各ボタンが押されているかどうかを取得する前に、ジョイパッドが存在するかどうかを調べ、存在しなければ処理を行わないようにしなければならない。ジョイパッドが存在するかどうかは、ジョイパッドデバイスが作成されたかどうかで調べることができる。

// ジョイパッドがない場合、それ以降の処理を行わない
if ( FAILED(g_diJoyState) )	return;

上記if文でreturnにならなかった場合、ジョイパッドデバイスが正常に作成されているので、各ボタンの情報(押されているか押されていないか)を取得できる。

ジョイパッド情報の取得

ジョイパッドのどのボタンが押されているかを格納する変数はNKC_DInput.cppですでに用意してある。取得したいところでGetJoypadState()という関数を実行すると、状態を取得し、変数に情報を格納する。

//-----------------------------------------------------------------------------
// 関数名 : UpdateFrame()
// 機能概要: ゲームメイン処理
//-----------------------------------------------------------------------------
void UpdateFrame(void)
{
    /* 現在の時間を取得 */
    gl_nowTime = timeGetTime();

    /* キーボードの状態を取得 */
    GetKeyboardState();

    // ジョイパッドの状態を取得
    GetJoypadState();
    ・
    ・
    ・
}

《POINT》

調べたいボタンが押されているかどうかを調べる

調べたいボタンが押されているかどうかは次のように判断する。

// カーソルキーの左が押されているかどうかを調べる
if ( g_diJoyState & BUTTON_LEFT ) {
    // 押されているときの処理
} else {
    // 押されていないときの処理
}

《POINT》


BACK(キーボードの状態を取得する) NEXT(マウスの状態を取得する)