Microsoft DirectX 8.0 (C++) |
Microsoft® DirectInput® にデバイスを列挙させるには、DIEnumDevicesCallback と同じ型のコールバック関数を作成する。ステップ 1 では、この関数のアドレスを IDirectInput8::EnumDevices メソッドに渡している。
DirectInput は、知る必要があるデバイスについての情報を通知する DIDEVICEINSTANCE 構造体へのポインタを、第 1 パラメータとしてコールバック関数へ渡す。次の例で最も重要な構造体メンバは guidInstance であり、これは、ユーザーのシステムで特定のハードウェアを識別する唯一の手段である。この GUID は IDirectInput8::CreateDevice メソッドに渡す必要がある。
次のサンプル コードは、コールバック関数の最初の部分であり、GUID を取り出してデバイス オブジェクトを作成する。
BOOL CALLBACK DIEnumDevicesProc( LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef ) { HRESULT hr; GUID DeviceGuid = lpddi->guidInstance; // ゲーム デバイスを生成する。 hr = g_lpDI->CreateDevice(DeviceGuid, &g_lpDIDevice, NULL); if (FAILED(hr)) // 成功または終了するまで列挙を続ける。 return DIENUM_CONTINUE;
コールバック関数の次の手順は、入力デバイスの設定手順に類似している。注意すべきは、どのフォース フィードバック デバイスにとっても排他協調レベルが必要であるということである。
// 協調レベルを設定する。 hr = g_lpDIDevice->SetCooperativeLevel(g_hwndMain, DISCL_EXCLUSIVE | DISCL_FOREGROUND); if (FAILED(hr)) return hr; // ゲーム データ形式の設定。 hr = g_lpDIDevice->SetDataFormat(&c_dfDIJoystick); if (FAILED(hr)) return hr;
最後に、デバイスの自動センタリング機能をオフにすることができる。基本的に自動センタリング機能は、モーターを使って標準ジョイスティックでスプリングをシミュレートする条件エフェクトである。この機能をオフにすると、ほかのエフェクトが妨害されなくなる。
DIPROPDWORD DIPropAutoCenter; DIPropAutoCenter.diph.dwSize = sizeof(DIPropAutoCenter); DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER); DIPropAutoCenter.diph.dwObj = 0; DIPropAutoCenter.diph.dwHow = DIPH_DEVICE; DIPropAutoCenter.dwData = DIPROPAUTOCENTER_OFF; hr = g_lpDIDevice->SetProperty(DIPROP_AUTOCENTER, &DIPropAutoCenter.diph); if (FAILED(hr)) { // 適宜失敗を処理する。 } return DIENUM_STOP; // 1 つで十分。 } // DIEnumDevicesProc の終了。
使用前に、デバイスを取得しなければならない。取得方法の例については、「チュートリアル 3 : ジョイスティックの使い方」の「ステップ 5 : ジョイスティックへのアクセス権の取得」を参照すること。ほかのプロパティ変更とは異なり、フォース フィードバック エフェクトは取得状態でデバイスにダウンロードできることに注意する。
DirectInput フォース フィードバック デバイスを作成したら、「ステップ 3 : サポートされるエフェクトの列挙」に進む。