Microsoft DirectX 8.0 (C++)

エフェクトの列挙

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

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

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

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

以下の例は、列挙を開始する。g_lpdid は、デバイスの IDirectInputDevice8 インターフェイスへの初期化されたポインタとする。

 
HRESULT hr = g_lpdid->EnumEffects(&DIEnumEffectsCallback,
        g_lpdid, DIEFT_ALL);

コールバックの骨格を、以下のコードに示す。このコールバック関数の pvRef パラメータは 32 ビットの任意の値を取ることができるが、この場合、このパラメータはデバイス インターフェイスへのポインタ (前の例のグローバル g_lpdid) であり、デバイスがサポートするエフェクトについての情報の取得と、エフェクト オブジェクトの生成に使用される。

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

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