エフェクトの作成
エフェクト オブジェクトは、次のコード例に示すように、IDirectInputDevice8::CreateEffect メソッドを使用して作成します。g_lpdid はインターフェイスのインスタンスを指します。この例では、ジョイスティックを 0.5 秒間最大フォースでユーザーから離れる方向に引くという単純なフォースを作成しています。
HRESULT hr;
LPDIRECTINPUTEFFECT lpdiEffect; // receives pointer to created effect
DIEFFECT diEffect; // parameters for created effect
DWORD dwAxes[2] = { DIJOFS_X, DIJOFS_Y };
LONG lDirection[2] = { 18000, 0 };
DICONSTANTFORCE diConstantForce;
diConstantForce.lMagnitude = DI_FFNOMINALMAX; // Full force
diEffect.dwSize = sizeof(DIEFFECT);
diEffect.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
diEffect.dwDuration = (DWORD)(0.5 * DI_SECONDS);
diEffect.dwSamplePeriod = 0; // = default
diEffect.dwGain = DI_FFNOMINALMAX; // No scaling
diEffect.dwTriggerButton = DIEB_NOTRIGGER; // Not a button response
diEffect.dwTriggerRepeatInterval = 0; // Not applicable
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,
&d iEffect,
&lpdiEffect,
NULL);
このメソッド呼び出しでは、最初のパラメーターは、作成されたエフェクトに関連付ける、サポートされるエフェクトを指定します。この例では、Dinput.h にある定義済みグローバル一意識別子 (GUID) の 1 つを使用しています。定義済みの GUID を使用する場合、デバイスが目的のエフェクトをサポートしていないときには呼び出しが失敗します。
2 番目のパラメーターは、DIEFFECT 構造体で指定されているパラメーターを設定します。
3 番目のパラメーターは、呼び出しが成功した場合にエフェクト オブジェクトへのポインターを受け取ります。
DIEFF_POLAR フラグは、フォースの方向に使用される座標のタイプを指定します(「エフェクトの方向」を参照してください)。このフラグは、DIEFF_OBJECTOFFSETS と組み合わせられます。DIEFF_OBJECTOFFSETS は、他のメンバーで使用されるすべてのボタンまたは軸がデバイスの DIDATAFORMAT 構造体内のオフセットで識別されることを示します。代わりに DIEFF_OBJECTIDS フラグを使用することもできます。このフラグは、ボタンや軸が、IDirectInputDevice8::EnumObjects メソッドを使用してオブジェクトを列挙したときにそのオブジェクトについて返された DIDEVICEOBJECTINSTANCE 構造体の dwTypes メンバーによって識別されることを示します。
DIEFFECT 構造体のメンバーの詳細については、「エフェクトの方向」を参照してください。