Platform SDK: DirectX |
エフェクト オブジェクトを生成するには、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 構造体のメンバの詳細については、「エフェクトの方向」を参照すること。
エフェクト オブジェクトを生成するには、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 型のうち使用するメンバは、エフェクトの種類によって異なる。コンスタント フォースは、単一のタイプ固有のパラメータのみを要求する、最も単純なフォースである。lGain、lDuration、および lTriggerButton の各メンバは、すべてのエフェクトに設定しなければならない。これらのメンバのデフォルト値はゼロであるが、通常は適切ではないためである。
デフォルトでは、エフェクトの方向は極座標で表される。つまり、DIEFFECT.x がフォースの来る方向を 100 分の 1 度単位で保持し、DIEFFECT.y はゼロでなければならない。
エフェクトは作成時にデバイスに自動的にダウンロードされる。これにより、デバイスは満杯ではなく、排他協力レベルで取得される。