前章で、DirectInputの初期化・開放処理を組み込んだ。ここでは、DirectInputを使ってインプットデバイスの状態を取得し、利用する方法を解説する。
インプットデバイスの情報(押されているか押されていないか)を格納する変数はNKC_DInput_AM.cppでグローバル変数として用意してある。取得したいところでGetInputData()
という関数を実行すると、パソコンに接続されているすべてのインプットデバイスから状態を取得し、変数に情報を格納する。
//-----------------------------------------------------------------------------
// 関数名 : UpdateFrame()
// 機能概要: ゲームメイン処理
//-----------------------------------------------------------------------------
void UpdateFrame(void)
{
/* 現在の時間を取得 */
gl_nowTime = timeGetTime();
/* 現在のキー情報を取得 */
//if ( !GetKeyboardState(KeyTbl) ) return;
/* 入力デバイス状態を取得(DirectInput) */
GetInputData();
・
・
・
}
各デバイスのボタンは、アクションマッピングによって次のように割り振ってある。
| 割り当て変数 | キーボード | マウス | ジョイパッド |
|---|---|---|---|
| input[デバイス番号].up | ↑ | 上に移動 | ↑ |
| input[デバイス番号].down | ↓ | 下に移動 | ↓ |
| input[デバイス番号].left | ← | 左に移動 | ← |
| input[デバイス番号].right | → | 右に移動 | → |
| input[デバイス番号].button_1 | Z | 左クリック | 1ボタン |
| input[デバイス番号].button_2 | X | 右クリック | 2ボタン |
| input[デバイス番号].start | Enter | なし | 3ボタン |
| input[デバイス番号].end | Esc | なし | 4ボタン |
DirectInput初期化時、パソコンに接続されているインプットデバイスの数が検出される。デバイス番号は0から始まる連番で、どの番号にどのデバイスが割り当てられるかは分からない。
ゲームループのたびにGetInputData関数を実行し、すべてのインプットデバイスの状態をinput構造体配列に格納する。よって、ユーザーはinput構造体配列から、調べたいキー(ボタン)が押されているかどうかを調べる。
例えば上(↑)が押されているかを調べると、次のようなプログラムになる。
// カーソルキーの上が押されているかどうかを調べる
for ( int in=0 ; in < g_DIDev_cnt ; in++ ) {
if ( input[in].up ) {
// 上が押されているときの処理
} else {
// 上が押されていないときの処理
}
}
このプログラムは、ハードディスクの任意の場所(※)にキーの割り当て情報がファイルとして保存される。よって、その場所にファイルを書き込む権限がないユーザーは正しく処理できない場合がある。
また、開発段階において、アクションマッピングの定義を頻繁に変えたり、他のアクションマッピングを利用したゲームを実行した場合にキー入力がおかしくなる場合がある。その場合は「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(複数のジョイパッドを制御する) |