DirectInputの初期化
DirectInputの初期化処理を解説します。
以下のサンプルはキーボードから入力情報を取得し特定のキーが押されたかを調べるサンプルです。
この節ではサンプルソースのDirectInputの初期化部分について解説を行います。
初期化の手順
DirectInputの初期化は処理は以下のように手順で行います。
- IDirectInput8 インタフェースの取得
- IDirectInputDevice8 インタフェースの取得
- デバイスのデータ形式の設定
- 協調レベルの設定
- 入力デバイスへのアクセス権取得
IDirectInput8 インタフェースの取得
IDirectInput8 インタフェースを取得するにはDirectInput8Create関数を使います。
// DirectInputオブジェクトの作成 if( FAILED( DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL ) ) ){ return E_FAIL; }
IDirectInputDevice8 インタフェースの取得
IDirectInputDevice8 インタフェースを取得するにはIDirectInput8 インタフェースのCreateDeviceメソッドを使います。
// キーボードデバイスインタフェースの取得 if( FAILED( g_pDI->CreateDevice( GUID_SysKeyboard, &g_pKeyboard, NULL ) ) ){ return E_FAIL; }
今回はキーボードのデバイスインターフェースを取得するためGUID_Syskeyboardを第1引数に指定しています。
デバイスのデータ形式の設定
デバイスのデータ形式の設定を行うにはIDirectInputDevice8 インタフェースのSetDataFormatメソッドを使います。
// デバイスのデータ形式の設定 if( FAILED( g_pKeyboard->SetDataFormat( &c_dfDIKeyboard ) ) ){ return E_FAIL; }
引数にはDIDATAFORMAT構造体型変数のアドレスを指定します。これは自分で定義することも出来ますが、
通常は既に定義済みのものがグローバル変数 c_dfDIKeyboard として用意されているので、これを使用します。
協調レベルの設定
次に協調レベルの設定を行います。協調レベルは、アクティブ時のみ入力を取得するのか、それともバックグラウンド時
でも入力取得を続けるのかや、入力デバイスのアクセス権を排他てきに使用するのかそれとも非排他的に使用するのか
といった設定になります。
// 協調レベルの設定 if( FAILED(g_pKeyboard->SetCooperativeLevel( g_hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE) ) ) { return E_FAIL; }
第2引数に指定しているDISCL_BACKGROUNDがバックグラウンドでも入力取得することを意味し、
さらにOR指定しているDISCL_NONEXCLUSIVEがアクセス権の非排他モードであることを意味しています。
入力デバイスへのアクセス権取得
最後に入力デバイスのアクセス権を取得します。アクセス権を取得を取得することによって入力デバイスから
入力情報を取得することが出来ます。
// 入力デバイスへのアクセス権取得 if( FAILED( g_pKeyboard->Acquire() ) ){ return E_FAIL; }
以上の処理で入力情報取得準備が整いました。次の節で入力情報の取得を解説します。
解放処理
アプリケーションの終了前には取得したオブジェクトの解放処理を行う必要があります。 IDirectInputDevice8 インタフェースを解放する前にはアクセス権の解放を行うようにしてください。
void Cleanup() { if (g_pDI){ if (g_pKeyboard){ g_pKeyboard->Unacquire(); // 入力デバイスへのアクセス権の解放 g_pKeyboard->Release(); // キーボードデバイスインタフェースの解放 g_pKeyboard = NULL; } g_pDI->Release(); // DirectInputオブジェクトの解放 g_pDI = NULL; } }