Microsoft DirectX 8.0 (Visual Basic)

ステップ 4 : エフェクトの変更

ユーザーがジョイスティックを使って鉄球を回転させるのに応じて、アプリケーションはエフェクトの方向とマグニチュードを調整する。しかし、まず最初に、そのデバイスがエフェクトを停止したり再スタートせずに、エフェクトの方向を変更することができるかどうかを調べる必要がある。Microsoft® DirectInput® は必要に応じてエフェクトの自動停止や自動再スタートを行うが、これを自分で行うことによって、滑らかな連続性がとぎれないようにすることができる。

エフェクトの機能を調べるには、まずサポートされているエフェクトを列挙する。これには DirectInputDevice8.GetEffectsEnum メソッドを使用して、DirectInputEnumEffects 型を解決する。DIEFT_CONSTANTFORCE フラグを使えば、サポートされているコンスタント フォース エフェクトのみを列挙できる。

Dim diEnumEffects As DirectInputEnumEffects
Set diEnumEffects = didev.GetEffectsEnum(DIEFT_CONSTANTFORCE)
 

次に目的のエフェクトの列挙を調べる。列挙されているエフェクトが基準を満たしている場合、DirectInputEnumEffects.GetDynamicParams メソッドを呼び出して、エフェクトのパラメータが停止や再スタートなく変更できるかどうかを調べる。GetDynamicParams によって返されるフラグを調べ、それを CONST_DIEPFLAGS の既知の値と比較する。次の例では、結果フラグを格納する変数 params が DIEP_DIRECTION と比較され、エフェクト実行中にエフェクトの方向を変更できることが確認されている。

Dim params As Long
Dim i As Long

For i = 1 To diEnumEffects.GetCount
    ' 標準のコンスタント フォースを探す。ほかの処理を行ってもよい。

    If diEnumEffects.GetEffectGuid(i) = "GUID_ConstantForce" Then
        params = diEnumEffects.GetDynamicParams(i)
        Exit For
    End If
 
Next i

If Not (params And DIEP_DIRECTION) Then
    ' 方向を動的に変えることはできない。変更対象のポイントを制限するなど、
    ' 補正のための措置をとる。
End If

同様に、エフェクトのマグニチュードを動的に変更できるかどうかを知るには、次のチェックを行う。

If Not (params And DIEP_TYPESPECIFICPARAMS)
   ' タイプ固有パラメータを動的には変更できない。
End If 

アプリケーションは、デバイスが入力に対してポーリングされるたびにエフェクトを変更する。変更後のマグニチュードは CurrentMag に、変更後の方向 (度数) は CurrentBearing に格納されるものとする。必要な変更を加えるために、関連する DIEFFECT のメンバのみを初期化する必要がある。

EffectInfo.constantForce.lMagnitude = CurrentMag
EffectInfo.x = CurrentBearing * DI_DEGREES

ここで、どのメンバに有効なデータが含まれているかを示すフラグと共に、新しいデータを含む DIEFFECT 型を DirectInputEffect.SetParameters に渡す。

di_effect.SetParameters(EffectInfo, _
        DIEP_DIRECTION Or DIEP_TYPESPECIFICPARAMS)

DIEP_TYPESPECIFICPARAMS フラグは、そのエフェクトのタイプに関連する情報を含むメンバが有効であることを示す。コンスタント フォースの場合、これは constantForce メンバを意味する。