Microsoft DirectX 8.0 (C++)

ステップ 3 : サポートされるエフェクトの列挙

これまでにフォース フィードバック デバイスの列挙と生成に成功したので、そのデバイスがサポートするエフェクトのタイプを列挙することができる。

どのデバイスでも利用可能な標準的エフェクトのみを生成したい場合は、エフェクトの列挙は必ずしも必要ではない。エフェクト オブジェクトを生成するとき、GUID_ConstantForceなどの定義済み GUID のうちどれか 1 つを使って、目的のエフェクト タイプを簡単に識別することができる。これらの識別子の全リストについては、「IDirectInputDevice8::CreateEffect」を参照すること。

もっと柔軟性のある方法は、特定タイプのサポートされるエフェクトを列挙し、コールバック関数からエフェクトに対する GUID を取得することである。もちろん、コールバック関数を使用して、エフェクトに対するデバイスのサポートについての詳細情報 (たとえば、デバイスがエンベロープをサポートしているかどうかについて) を得ることもできるが、このチュートリアルではエフェクト GUID だけを取得することにする。

まず、列挙されたエフェクトそれぞれについて、Microsoft® DirectInput® によって呼び出されるコールバック関数を生成する。この標準コールバックの情報については、「DIEnumEffectsCallback」を参照すること。この関数には好きな名前を付けることができる。

BOOL  EffectFound = FALSE;  // グローバル フラグ。
 
BOOL CALLBACK DIEnumEffectsProc(LPCDIEFFECTINFO pei, LPVOID pv)
{
    *((GUID *)pv) = pei->guid;
    EffectFound = TRUE;
    return DIENUM_STOP;  // 1 つで十分。
}
 

アプリケーションで定義された値 pv が指す GUID 変数には、エフェクトのために DirectInput が生成する DIEFFECTINFO 構造体へ渡される値が代入される。

エフェクト GUID を取得するために、次のように IDirectInputDevice8::EnumEffects メソッドを呼び出し、コールバックを開始する。

HRESULT  hr;
GUID     guidEffect;
 
hr = g_lpDIDevice->EnumEffects(
                         (LPDIENUMEFFECTSCALLBACK) DIEnumEffectsProc,
                          &guidEffect, 
                          DIEFT_PERIODIC);
if (FAILED(hr))
{
    // 成功してもエフェクトが見つかったとは限らないので注意する。
    // 単に処理がスムーズに行われたことを意味する。
}
 

GUID 変数のアドレス guidEffect EnumEffects メソッドに渡すことに注意すること。このアドレスは、コールバック関数に pv パラメータとして渡される。さらに、DIEFT_PERIODIC フラグを設定して、列挙対象を周期的エフェクトに限定する。

サポートされるエフェクトが列挙できたら、「ステップ 4 : エフェクトの作成」に進む。