次の方法で共有


エフェクトの列挙

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

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

作成されたエフェクトの列挙の詳細については、「エフェクト オブジェクトの列挙」を参照してください。

他の 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;   
// Pointer to calling device
    LPDIRECTINPUTEFFECT  lpdiEffect;      // Pointer to created effect
    DIEFFECT             diEffect;        // Params for created effect
    DICONSTANTFORCE      diConstantForce; // Type-specific parameters
 

    if (DIEFT_GETTYPE(pdei->dwEffType) == DIEFT_CONSTANTFORCE)
    {
       /* Here you can extract information about support for the 
          effect type (from pdei), and tailor your effects 
          accordingly. For example, the device might not support
          envelopes for this type of effect. */
       .
       .
       .
       // Create one or more constant force effects. 
       // For each, you have to initialize a DICONSTANTFORCE 
       // and a DIEFFECT structure. 
       .
       .
       .
        hr = lpdid->CreateEffect(pdei->guid,
                                &diEffect,
                                &lpdiEffect,
                                NULL);
       .
       .
       .
    }
    // And so on for other types of effect
   .
   .
   .
 
    return DIENUM_CONTINUE;
    }  // End of callback

エフェクト作成の詳細な例、およびエフェクトの初期化方法の詳細については、「エフェクトの作成」を参照してください。