Platform SDK: DirectX

エフェクトの生成

[C++]

エフェクト オブジェクトを生成するには、IDirectInputDevice7::CreateEffect メソッドを使用する。次のサンプル コードで、pdev2 はインターフェイスのインスタンスを指している。この例では、半秒間に全力でジョイスティックをユーザーから離れる方向へ引くという、非常に単純なエフェクトが生成される。

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 = 0.5 * DI_SECONDS;
diEffect.dwSamplePeriod = 0;               // デフォルト値
diEffect.dwGain = DI_FFNOMINALMAX;         // スケーリングなし
diEffect.dwTriggerButton = DIEB_NOTRIGGER; // ボタン応答ではない。
diEffect.dwTriggerRepeatInterval = 0;   // 利用できない。
diEffect.cAxes = 2;
diEffect.rgdwAxes = &dwAxes;
diEffect.rglDirection = &lDirection;
diEffect.lpEnvelope = NULL;
diEffect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
diEffect.lpvTypeSpecificParams = &diConstantForce;
 
hr = pdev2->CreateEffect(GUID_ConstantForce,
&diEffect,
&lpdiEffect,
NULL);

このメソッド呼び出しでは、最初のパラメータは、生成されるエフェクトに関連付けられたサポートされるエフェクトを表す。この例では、Dinput.h で定義済みの GUID のうちの 1 つを使用している。定義済みの GUID を使用する場合、デバイスがこのエフェクトをサポートしなければ呼び出しは失敗する。

第 2 のパラメータは、DIEFFECT 構造体に指定されているパラメータを設定する。

第 3 のパラメータは、呼び出しが成功した場合に、エフェクト オブジェクトへのポインタを受け取る。

DIEFF_POLAR フラグは、フォースの方向に使用する座標の種類を指定する (「エフェクトの方向」を参照すること)。このフラグは DIEFF_OBJECTOFFSETS と組み合わされる。これは、ほかのメンバで使用されるボタンや軸も、このデバイスの DIDATAFORMAT 構造体の中でオフセットによって識別される、ということを示す。この代わりに DIEFF_OBJECTIDS フラグを使用することができる。このフラグは、オブジェクトが IDirectInputDevice7::EnumObjects メソッドで列挙されたとき、そのオブジェクトに対して返される DIDEVICEOBJECTINSTANCE 構造体の dwType メンバによってボタンと軸が識別される、ということを意味している。

DIEFFECT 構造体のメンバの詳細については、「エフェクトの方向」を参照すること。

[Visual Basic]

エフェクト オブジェクトを生成するには、DirectInputDevice.CreateEffect メソッドを使用する。次のサンプル コードでは、didev DirectInputDevice オブジェクトを指している。この例では、半秒間に全力でジョイスティックをユーザーから離れる方向へ引くという、非常に単純なエフェクトが生成される。

Dim effectInfo As DIEFFECT
Dim objDIEffect As DirectInputEffect 

With effectInfo
 
.constantForce.lMagnitude = 10000
.lGain = 10000
.lDuration = 500000
.x = 18000
.lTriggerButton = -1  ' トリガ ボタンなし
End With
 
didev.Acquire
Set objDIEffect = didev.CreateEffect("GUID_ConstantForce", effectInfo)

最初のパラメータには、事前定義された GUID の 1 つ、または、ハードウェア ドキュメントや DirectInputEnumEffects.GetEffectGuid メソッドで列挙されたエフェクトとして取得された、文字列形式の実際の GUID を使用できる。

DIEFFECT 型のうち使用するメンバは、エフェクトの種類によって異なる。コンスタント フォースは、単一のタイプ固有のパラメータのみを要求する、最も単純なフォースである。lGainlDuration、および lTriggerButton の各メンバは、すべてのエフェクトに設定しなければならない。これらのメンバのデフォルト値はゼロであるが、通常は適切ではないためである。

デフォルトでは、エフェクトの方向は極座標で表される。つまり、DIEFFECT.x がフォースの来る方向を 100 分の 1 度単位で保持し、DIEFFECT.y はゼロでなければならない。

エフェクトは作成時にデバイスに自動的にダウンロードされる。これにより、デバイスは満杯ではなく、排他協力レベルで取得される。