使い方

前章で、DirectInputの初期化・開放処理を組み込んだ。ここでは、DirectInputを使ってインプットデバイスの状態を取得し、利用する方法を解説する。

インプットデバイス情報の取得

インプットデバイスの情報(押されているか押されていないか)を格納する変数はNKC_DInput_AM.cppでグローバル変数として用意してある。取得したいところでGetInputData()という関数を実行すると、パソコンに接続されているすべてのインプットデバイスから状態を取得し、変数に情報を格納する。

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

    /* 現在のキー情報を取得 */
    //if ( !GetKeyboardState(KeyTbl) ) return;

    /* 入力デバイス状態を取得(DirectInput) */
    GetInputData();
    ・
    ・
    ・
}

《POINT》

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

各デバイスのボタンは、アクションマッピングによって次のように割り振ってある。

割り当て変数キーボードマウスジョイパッド
input[デバイス番号].up上に移動
input[デバイス番号].down下に移動
input[デバイス番号].left左に移動
input[デバイス番号].right右に移動
input[デバイス番号].button_1Z左クリック1ボタン
input[デバイス番号].button_2X右クリック2ボタン
input[デバイス番号].startEnterなし3ボタン
input[デバイス番号].endEscなし4ボタン

DirectInput初期化時、パソコンに接続されているインプットデバイスの数が検出される。デバイス番号は0から始まる連番で、どの番号にどのデバイスが割り当てられるかは分からない。

ゲームループのたびにGetInputData関数を実行し、すべてのインプットデバイスの状態をinput構造体配列に格納する。よって、ユーザーはinput構造体配列から、調べたいキー(ボタン)が押されているかどうかを調べる。

例えば上(↑)が押されているかを調べると、次のようなプログラムになる。

// カーソルキーの上が押されているかどうかを調べる
for ( int in=0 ; in < g_DIDev_cnt ; in++ ) {
    if ( input[in].up ) {
        // 上が押されているときの処理
    } else {
        // 上が押されていないときの処理
    }
}

《POINT》

  1. 配列番号によってデバイスを特定できないため、すべてのデバイス情報を検索しなければならない。
  2. デバイスの種類によってプログラムを変える必要がない

注意事項

このプログラムは、ハードディスクの任意の場所(※)にキーの割り当て情報がファイルとして保存される。よって、その場所にファイルを書き込む権限がないユーザーは正しく処理できない場合がある。

また、開発段階において、アクションマッピングの定義を頻繁に変えたり、他のアクションマッピングを利用したゲームを実行した場合にキー入力がおかしくなる場合がある。その場合は「C:\Program Files\Common Files\DirectX\DirectInput\User Maps\」内に保存されているファイルをすべて削除すればよい(※2)。

※ 何故「C:\Program Files\Common Files\DirectX\DirectInput\User Maps\」になるか、調査する予定・・・

※2 DirectInputオブジェクトの開放時、これらのファイルを削除するようにプログラムしてあるが、効いていないようで、ファイルが残ってしまう・・・ちゃんと削除されるように修正する予定・・・


BACK(NKC_DInput_AM.cppファイルの組み込み) NEXT(複数のジョイパッドを制御する)