ホーム > DirectInput > 共通の処理

共通の処理

目次

  1. DirectInput8オブジェクトの作成
  2. デバイスの作成
  3. デバイスの設定
  4. バッファリングデータで取得するデバイスのみの設定
  5. アクセス権の取得
  6. デバイスの状態を直接データで取得する場合
  7. デバイスの状態をバッファリングデータで取得する場合
  8. 終了処理

DirectInput8オブジェクトの作成

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 );


inserted by FC2 system