Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectInput Visual Basic チュートリアル」を参照すること。
DirectInput にデバイスを列挙させるには、DIEnumDevicesCallback と同種のコールバック関数を作成しなければならない。ステップ 1 では、この関数のアドレスを IDirectInput7::EnumDevices メソッドに渡している。
DirectInput は、知る必要があるデバイスについての情報を通知する DIDEVICEINSTANCE 構造体へのポインタを、第 1 パラメータとしてコールバック関数へ渡す。次の例で最も重要な構造体メンバは guidInstance であり、これは、ユーザーのシステムで特定のハードウェアを識別する唯一の手段である。この GUID は、後で IDirectInput7::CreateDeviceEx メソッドに渡さなければならない。
次に示すのは、コールバック関数の最初の部分であり、GUID を取り出してデバイス オブジェクトを作成する。
BOOL CALLBACK DIEnumDevicesProc(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) { HRESULT hr; GUID DeviceGuid = lpddi->guidInstance; // ゲーム デバイスを生成する。 hr = lpdi->CreateDeviceEx(DeviceGuid, IID_IDirectInputDevice7, (void**)&g_lpdid7, NULL); if (FAILED(hr)) { OutputDebugString("デバイスの作成に失敗しました。\n"); return DIENUM_STOP; }
次の手順は、まだコールバック関数の中であるが、入力デバイスのセットアップ処理に類似している。注意すべきは、どのフォース フィードバック デバイスにとっても排他協調レベルが必要であるということである。また、データ形式を設定する必要もある。
// 協調レベルの設定 if (FAILED(g_lpdid7->SetCooperativeLevel(hMainWindow, DISCL_EXCLUSIVE | DISCL_FOREGROUND))) { OutputDebugString( "協調レベルの設定に失敗しました。\n"); g_lpdid7->Release(); g_lpdid7 = NULL; return DIENUM_STOP; } // ゲームデータ形式の設定 if (FAILED(g_lpdid7->SetDataFormat(&c_dfDIJoystick))) { OutputDebugString("ゲーム デバイス データ形式の設定に失敗しました。\n"); g_lpdid7->Release(); g_lpdid7 = NULL; return DIENUM_STOP; }
最後に、デバイスの自動センタリング機能をオフにしたい場合に触れる。基本的に自動センタリング機能は、モーターを使って標準ジョイスティックでスプリングをシミュレートする条件エフェクトである。この機能をオフにすると、ほかのエフェクトが妨害されなくなる。
DIPROPDWORD DIPropAutoCenter; DIPropAutoCenter.diph.dwSize = sizeof(DIPropAutoCenter); DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER); DIPropAutoCenter.diph.dwObj = 0; DIPropAutoCenter.diph.dwHow = DIPH_DEVICE; DIPropAutoCenter.dwData = 0; if (FAILED(lpdid7->SetProperty(DIPROP_AUTOCENTER, &DIPropAutoCenter.diph))) { OutputDebugString("Failed to change device property.\n"); } return DIENUM_STOP; // 1 つで十分。 } // DIEnumDevicesProc の終了。
使用前に、デバイスを取得しなければならない。取得方法の例については、チュートリアル 3 の「ステップ 5 : ジョイスティックへのアクセス権の取得」を参照すること。