Platform SDK: DirectX

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

[C++]

ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectInput C/C++ チュートリアル」を参照すること。

[Visual Basic]

ユーザーが鉄球を回転させるのに応じて、アプリケーションはエフェクトの方向とマグニチュードを調整する。ただし、最初に、そのデバイスでエフェクトを停止して再開せずにエフェクトの方向を変更できるかどうかを調べる必要がある。DirectInput は必要に応じてエフェクトを停止して再開するが、動作の連続性を保ちながら、アプリケーションの動作を変更したい場合もある。

エフェクトの能力を調べるために、サポートされるエフェクトを列挙し、必要な特定のエフェクトを探す必要がある。

Dim diEnumEffects As DirectInputEnumEffects
Dim params As Long
Dim i As Long
 
' コンスタント フォースを列挙する。
 
Set diEnumEffects = didev.GetEffectsEnum(DIEFT_CONSTANTFORCE)
 
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 * 100

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

di_effect.SetParameters(EffectInfo, _
        DIEP_DIRECTION Or DIEP_TYPESPECIFICPARAMS)

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