DirectInputを使用するために「dinput.h」をインクルードし「dxguid.lib」と「dinput8.lib」をリンクします。
#include <dinput.h>
DirectInput8オブジェクトを作成します。
LPDIRECTINPUT8 g_lpDI = NULL; DirectInput8Create( g_hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&g_lpDI, NULL );
デバイスを作成します。「IDirectInput8::CreateDevice」の第1引数に作成するデバイスのGUIDを指定します。
デバイス | 値 |
---|---|
キーボード | GUID_SysKeyboard |
マウス | GUID_SysMouse |
ジョイスティック | なし |
LPDIRECTINPUTDEVICE8 g_lpDIDevice = NULL; g_lpDI->CreateDevice( GUID_SysKeyboard, &g_lpDIDevice, NULL );
「IDirectInputDevice8::SetDataFormat」でデバイスに取得するデータフォーマットを設定します。引数には取得するデータ情報を表すDIDATAFORMAT構造体を渡します。独自のDIDATAFORMAT構造体変数を使用することも、定義済みの構造体変数を使用することもできます。通常は定義済みの構造体変数を使用します。
デバイス | 定義済みの構造体変数 |
---|---|
キーボード | c_dfDIKeyboard |
マウス | c_dfDIMouse・c_dfDIMouse2 |
ジョイスティック | c_dfDIJoystick・c_dfDIJoystick2 |
g_lpDI->SetDataFormat( &c_dfDIKeyboard );
協調レベルを設定します。協調レベルには2つ設定があります。それは、デバイスをフォアグラウンドまたはバックグラウンドで使うかと、排他または非排他で使うかです。これら2つのどちらかを選択し、ORで合成して指定します。
レベル | 説明 | フラグ |
---|---|---|
フォアグラウンド | ウインドウが非アクティブになると、デバイスの制御を一時停止する。 | DISCL_FOREGROUND |
バックグラウンド | 常にデバイスから情報を取得できる。 | DISCL_BACKGROUND |
レベル | 説明 | フラグ |
---|---|---|
排他 | 他のアプリケーションが使用しているデバイスにアクセスできなくなる。 | DISCL_EXCLUSIVE |
非排他 | 他のアプリケーションも使用しているデバイスにアクセスできる。 他のアプリケーションの妨げにならない。 | DISCL_NONEXCLUSIVE |
// フォアグラウンドで非排他 g_lpDIDevice->SetCooperativeLevel( g_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ); // バックグラウンドで排他 g_lpDIDevice->SetCooperativeLevel( g_hWnd, DISCL_BACKGROUND | DISCL_EXCLUSIVE );
バッファサイズの値を設定します。この設定は、状態をバッファリングデータで取得するデバイスに行います。直接データで取得するデバイスには、設定する必要はありません。
// バッファリングデータを取得するため、バッファサイズを設定 DIPROPDWORD diprop; diprop.diph.dwSize = sizeof(diprop); diprop.diph.dwHeaderSize = sizeof(diprop.diph); diprop.diph.dwObj = 0; diprop.diph.dwHow = DIPH_DEVICE; diprop.dwData = 100; g_lpDIDevice->SetProperty( DIPROP_BUFFERSIZE, &diprop.diph );
デバイスへのアクセス権を取得します。
g_lpDIDevice->Acquire();
「IDirectInputDevice8::GetDeviceState 」で直接データを取得します。第1引数に取得するサイズ、第2引数にデータ格納先のポインタを指定します。データフォーマットで定義済み構造体変数を使用した場合、下記の変数を渡します。
デバイス | 変数 |
---|---|
c_dfDIKeyboard | 256バイトの配列 |
c_dfDIMouse | DIMOUSESTATE構造体 |
c_dfDIMouse2 | DIMOUSESTATE2構造体 |
c_dfDIJoystick | DIJOYSTATE構造体 |
c_dfDIJoystick2 | DIJOYSTATE2構造体 |
// キーボードの状態を取得 BYTE byKeyState[256]; g_lpDIDevice->GetDeviceState( 256, byKeyState ); // マウスの状態を取得 DIMOUSESTATE dims; g_lpDIDevice->GetDeviceState( sizeof(DIMOUSESTATE), &dims ); // ジョイスティックの状態を取得 DIJOYSTATE dijs; g_lpDIDevice->Poll(); g_lpDIDevice->GetDeviceState( sizeof(DIJOYSTATE), &dijs );
// デバイスのバッファリングデータを取得する while( TRUE ) { DIDEVICEOBJECTDATA od; HRESULT hr; DWORD dwInOut = 1; hr = g_lpDIDevice->GetDeviceData( sizeof(od), &od, &dwInOut, 0 ); if( FAILED(hr) || dwInOut == 0 ) break; else { switch( od.dwOfs ) { // 各ボタンが押されたときの処理 } } }
作成したデバイスのアクセスを「IDirectInputDevice8::Unacquire」で解放して、全てのオブジェクトを解放します。
/* #define RELEASE(p) { if(p){(p)->Release();p=NULL;} } */ g_lpDIDevice->Unacquire(); RELEASE( g_lpDIDevice ); RELEASE( g_lpDI );