Microsoft DirectX 8.0 (C++) |
エフェクト オブジェクトを生成するには、IDirectInputDevice8::CreateEffect メソッドを使用する。次のサンプル コードで、g_lpdid はインターフェイスのインスタンスを指している。この例では、半秒間に全力でジョイスティックをユーザーから離れる方向へ引くという、非常に単純なエフェクトが生成される。
HRESULT hr; LPDIRECTINPUTEFFECT lpdiEffect; // 生成されるエフェクトへのポインタを受け取る。 DIEFFECT diEffect; // 生成されるエフェクト用のパラメータ。 DWORD dwAxes[2] = { DIJOFS_X, DIJOFS_Y }; LONG lDirection[2] = { 18000, 0 }; DICONSTANTFORCE diConstantForce; diConstantForce.lMagnitude = DI_FFNOMINALMAX; // 最大フォース。 diEffect.dwSize = sizeof(DIEFFECT); diEffect.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS; diEffect.dwDuration = (DWORD)(0.5 * DI_SECONDS); diEffect.dwSamplePeriod = 0; // デフォルト設定。 diEffect.dwGain = DI_FFNOMINALMAX; // スケーリングなし。 diEffect.dwTriggerButton = DIEB_NOTRIGGER; // ボタン応答ではない。 diEffect.dwTriggerRepeatInterval = 0; // 利用できない。 diEffect.cAxes = 2; diEffect.rgdwAxes = &dwAxes[0]; diEffect.rglDirection = &lDirection[0]; diEffect.lpEnvelope = NULL; diEffect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); diEffect.lpvTypeSpecificParams = &diConstantForce; hr = g_lpdid->CreateEffect(GUID_ConstantForce, &diEffect, &lpdiEffect, NULL);
このメソッド呼び出しでは、最初のパラメータは、生成されるエフェクトに関連付けられたサポートされるエフェクトを表す。この例では、Dinput.h で定義済みの GUID のうちの 1 つを使用している。定義済みの GUID を使用する場合、デバイスがこのエフェクトをサポートしなければ呼び出しは失敗する。
第 2 のパラメータは、DIEFFECT 構造体に指定されているパラメータを設定する。
第 3 のパラメータは、呼び出しが成功した場合に、エフェクト オブジェクトへのポインタを受け取る。
DIEFF_POLAR フラグは、フォースの方向に使用する座標の種類を指定する (「エフェクトの方向」を参照すること)。このフラグは DIEFF_OBJECTOFFSETS と組み合わされる。これは、ほかのメンバで使用されるボタンや軸も、このデバイスの DIDATAFORMAT 構造体の中でオフセットによって識別される、ということを示す。この代わりに DIEFF_OBJECTIDS フラグを使用することができる。このフラグは、オブジェクトが IDirectInputDevice8::EnumObjects メソッドで列挙されたとき、そのオブジェクトに対して返される DIDEVICEOBJECTINSTANCE 構造体の dwType メンバによってボタンと軸が識別される、ということを意味している。
DIEFFECT 構造体のメンバの詳細については、「エフェクトの方向」を参照すること。
デバイスが満杯ではなく、排他協調レベルで取得されたなら、エフェクトは作成時にデバイスに自動的にダウンロードされる。