Microsoft DirectX 8.0 (C++)

ファイルからのエフェクトの読み込み

Microsoft® DirectX® SDK で提供される Force Editor、または同じファイル フォーマットを使用する別のアプリケーションを使って、エフェクトをデザインし、ファイルに保存することができる。実行時にこれらのエフェクトを読み込むことで、任意のアプリケーションで使用することができる。

エフェクトを読み込むには、IDirectInputDevice8::EnumEffectsInFile メソッドを呼び出す。デフォルトでは、列挙は標準の Microsoft DirectInput® エフェクトに限定されるが、DIFEF_INCLUDENONSTANDARD フラグを設定することで、これ以外のエフェクトを列挙できる。また、DIFEF_MODIFYIFNEEDED フラグを設定すると、必要に応じて、エフェクトがデバイスに対して作用するように、各エフェクトのパラメータの変更を DirectInput に指示することができる(たとえば、2 つの軸に対して作成されたエフェクトを、単一軸の車のハンドルに対して作用させることができる)。

次のサンプル コードでは、最初の 3 つの標準エフェクトがファイルから読み込まれ、DirectInputEffect オブジェクトとして作成される。

// g_lpdid は、フォース フィードバック デバイスへの有効な 
// IDirectInputDevice7 ポインタである。 

// エフェクト ポインタの配列は、グローバルに宣言される。 
LPDIRECTINPUTEFFECT pEff[3];
.
.
.
g_lpdid->EnumEffectsInFile("FEdit1.ffe", 
                            EnumEffectsInFileProc,
                            NULL, 
                            DIFEF_MODIFYIFNEEDED);
.
.
.

以下のコールバック関数は、DIENUM_STOP が返されるまで、エフェクト ファイル内のエフェクトごとに呼び出される。DIFEF_MODIFYIFNEEDED フラグが渡されたため、エフェクト パラメータは lpdife->lpDiEffect に変更されることに注意すること。このようにパラメータを修正したコールバックによって、エフェクトが生成される。

BOOL CALLBACK EnumEffectsInFileProc(LPCDIFILEEFFECT lpdife, 
        LPVOID pvRef)
 
{
    HRESULT     hr;
    static int  i;
 
 
    hr = g_lpdid->CreateEffect(lpdife->GuidEffect, 
                               lpdife->lpDiEffect,
                               &pEff[i], 
                               NULL);
    if (FAILED(hr))
    {
        // エラー処理。
    }
    if (++i > 2) return DIENUM_STOP;
    else return DIENUM_CONTINUE;
}

Microsoft® DirectX® SDK で提供される Force Editor、または同じファイル フォーマットを使用する別のアプリケーションを使って、エフェクトをデザインし、ファイルに保存することができる。実行時にこれらのエフェクトを読み込むことで、任意のアプリケーションで使用することができる。

エフェクトを読み込むには、DirectInputDevice8.CreateEffectFromFile メソッドを呼び出す。その後、生成される DirectInputEffect オブジェクトを通常どおり使用できる。