Platform SDK: DirectX

エフェクトの列挙

[C++]

IDirectInputDevice7::EnumEffects メソッドは、さまざまな種類のエフェクトに関して、デバイスで提供されるサポートについての情報を返す。

"サポートされるエフェクト" と "生成されるエフェクト" ("エフェクト オブジェクト") の両者を区別することが重要である。サポートされるエフェクトは、エンベロープによって形成できるコンスタント フォースである。しかし、このエフェクトには、マグニチュード、方向、継続時間、アタックまたはフェードなどのプロパティがまったくない。アプリケーションでエフェクト オブジェクトを生成するときは、これらのプロパティを設定する。サポートされるエフェクトは、それぞれ異なるパラメータを持つ多くのエフェクト オブジェクトによって表すことができる。たとえば、それぞれ異なる継続時間、マグニチュードおよび方向を持つ複数のコンスタント フォースによって表すことができる。

生成されたエフェクトの列挙については、「エフェクト オブジェクトの列挙」を参照すること。

ほかの DirectInput 列挙と同様に、IDirectInputDevice7::EnumEffects メソッドにはコールバック関数が必要である。ドキュメントではこの関数はプレースホルダ名の DIEnumEffectsCallback で表されているが、好きな名前を付けることができる。この関数は、列挙されるエフェクトごとに呼び出される。この関数内では、それぞれのエフェクトに対する GUID を取得でき、ハードウェア サポートの範囲についての情報を取得でき、さらに、1 つまたはそれ以上のエフェクト オブジェクトを生成し、そのオブジェクトのメソッドを使用してエフェクトを操作することができる。

以下の例は、列挙を開始する IDirectInputDevice7::EnumEffects メソッドを呼び出すコードである。このコールバック関数の pvRef パラメータは 32 ビットの任意の値を取ることができる。この場合、このパラメータはデバイス インターフェイスへのポインタであり、デバイスがサポートするエフェクトについての情報の取得と、エフェクト オブジェクトの生成に使用される。

HRESULT hr;
// LPDIRECTINPUTDEVICE lpdid2;  // 初期化済み。
 
BOOL CALLBACK DIEnumEffectsCallback(LPCDIEFFECTINFO pdei,
LPVOID pvRef)
{
LPDIRECTINPUTDEVICE2 lpdid = pvRef;  // 呼び出しデバイスへのポインタ。
LPDIRECTINPUTEFFECT lpdiEffect;   // 生成されたエフェクトへのポインタ。
DIEFFECT      diEffect;   // 生成されたエフェクト用のパラメータ。
DICONSTANTFORCE   diConstantForce; // タイプ固有パラメータ。
                                          // for diEffect
    
 
if (DIEF_GETTYPE(pdei->dwEffType) == DIEFFT_CONSTANTFORCE)
    {
/* エフェクト タイプ (pdei から) のサポート情報を
抽出し、それに応じてエフェクトを適応させること
ができる。たとえば、このデバイスは、このタイプ
のエフェクトではエンベロープをサポートしない。*/
       .
       .
       .
// 1 つまたはそれ以上のコンスタント フォース エフェクトを生成する。
// それぞれについて、DICONSTANTFORCE と
// DIEFFECT 構造体を初期化しなければならない。
// 「エフェクトの生成」で詳しい例を参照すること。
       .
       .
       .
hr = pdid->CreateEffect(pdei->guid,
&diEffect,
&lpdiEffect,
NULL);
       .
       .
       .
    }
// ほかのタイプのエフェクトについても同様。
   .
   .
   .
 
return DIENUM_CONTINUE;
} // コールバックの終了。
.
.
.
// コールバックの始動。
hr = lpdid2->EnumEffects(&EnumEffectsCallback,
lpdid2, DIEFT_ALL);

エフェクトを初期化する方法の詳細については、「エフェクトの生成」を参照すること。

[Visual Basic]

DirectInputDevice.GetEffectsEnum メソッドは、デバイスによりサポートされるエフェクトを列挙する。このメソッドは、サポートされるエフェクトのコレクションを表す DirectInputEnumEffects オブジェクトを返す。DirectInputEnumEffects の各メソッドを使うと、特定のエフェクトに関する情報を取得できる。

"サポートされるエフェクト" と "生成されるエフェクト" ("エフェクト オブジェクト") の両者を区別することが重要である。サポートされるエフェクトは、エンベロープ によって形成できるコンスタント フォースである。しかし、このエフェクトには、マグニチュード、方向、継続時間、アタックまたはフェードなどのプロパティがまったくない。アプリケーションでエフェクト オブジェクトを生成するときは、これらのプロパティを設定する。サポートされるエフェクトは、それぞれ異なるパラメータを持つ多くのエフェクト オブジェクトによって表すことができる。たとえば、それぞれ異なる継続時間、マグニチュードおよび方向を持つ複数のコンスタント フォースによって表すことができる。

次のコードは、アプリケーションがハードウェア固有のエフェクトを列挙して、Microsoft® SideWinder® ジョイスティックによりサポートされる固有のエフェクトを探す例である。目的のエフェクトが見つからない場合は、アプリケーションは標準エフェクトのいずれかを代用する。

Const BasketballDribble = _
"{E84CD1AC-81FA-11D0-94AB-0080C74C7E95}"
Dim diEnumEffects as DirectInputEnumEffects
Dim EffGuid As String
Dim i as Integer

' diDev は DirectInputDevice オブジェクトである。
Set diEnumEffects = didev.GetEffectsEnum(DIEFT_HARDWARE)
For i = 1 To diEnumEffects.GetCount
If diEnumEffects.GetEffectGuid(i) = BasketballDribble Then
EffGuid = BasketballDribble
Exit For
End If
Next i
If EffGuid <> BasketballDribble Then
EffGuid = "GUID_Sine"
' ここで、列挙されたドリブルのパラメータを設定する。
End If
 
' 最後に EffGuid を DirectInputDevice.CreateEffect に渡す。