Microsoft DirectX 8.0 (C++)

ステップ 4 : エフェクトの作成

エフェクトの列挙後 EffectFound の値が FALSE でなければ、必要なエフェクト タイプの少なくとも 1 つに対するサポートを Microsoft® DirectInput® が発見したと見なしてよい。エフェクト GUID がわかっているので、今度はエフェクト オブジェクトを生成することができる。

IDirectInputDevice8::CreateEffect メソッドを呼び出す前に、次の配列と構造体を設定する必要がある。

配列は、構造体と共に、宣言するときに初期化できる。

DWORD      dwAxes[2] = {DIJOFS_X, DIJOFS_Y};
LONG       lDirection[2] = {0, 0};
 
DIPERIODIC diPeriodic;      // タイプ固有パラメータ。
DIENVELOPE diEnvelope;      // エンベロープ。
DIEFFECT   diEffect;        // 汎用パラメータ。
 

次に型固有のパラメータを初期化する。この例の値は、1 秒の 20 分の 1 の周期で、フルフォースの周期的エフェクトを作成する。

diPeriodic.dwMagnitude = DI_FFNOMINALMAX; 
diPeriodic.lOffset = 0; 
diPeriodic.dwPhase = 0; 
diPeriodic.dwPeriod = (DWORD)(0.05 * DI_SECONDS); 
 

チェーンソーのモーターが始動しようとして、しばらく咳のような音を出し、次第にそれが収まっていくというエフェクトを得るために、エンベロープに半秒間のアタック時間と 1 秒間のフェード時間を設定する。

diEnvelope.dwSize = sizeof(DIENVELOPE);
diEnvelope.dwAttackLevel = 0; 
diEnvelope.dwAttackTime = (DWORD)(0.5 * DI_SECONDS); 
diEnvelope.dwFadeLevel = 0; 
diEnvelope.dwFadeTime = (DWORD)(1.0 * DI_SECONDS); 
 

次に、基本的なエフェクト パラメータを設定する。これらのパラメータには、方向とデバイス オブジェクト (ボタンと軸) の識別方法を決定するフラグ、エフェクトのサンプル周期とゲイン、およびさきほど準備した他のデータへのポインタが含まれる。さらに、ジョイスティックの発射ボタンにエフェクトを割り付けて、ボタンを押せばエフェクトが自動的に再生するようにする。

diEffect.dwSize = sizeof(DIEFFECT); 
diEffect.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS; 
diEffect.dwDuration = (DWORD)(2 * DI_SECONDS);
 
diEffect.dwSamplePeriod = 0;               // デフォルト設定。
diEffect.dwGain = DI_FFNOMINALMAX;         // スケーリングなし。
diEffect.dwTriggerButton = DIJOFS_BUTTON0;
diEffect.dwTriggerRepeatInterval = 0;      
diEffect.cAxes = 2; 
diEffect.rgdwAxes = dwAxes; 
diEffect.rglDirection = &lDirection[0]; 
diEffect.lpEnvelope = &diEnvelope; 
diEffect.cbTypeSpecificParams = sizeof(diPeriodic);
diEffect.lpvTypeSpecificParams = &diPeriodic;  
 

最後に、エフェクトを作成する。

LPDIRECTINPUTEFFECT  g_lpdiEffect;  // グローバル エフェクト オブジェクト。
 
hr = g_lpDIDevice->CreateEffect(
                     guidEffect,     // 列挙からの GUID。
                     &diEffect,      // データの場所。
                     &g_lpdiEffect,  // インターフェイス ポインタを置く場所。
                     NULL);          // 集成体なし。
if (FAILED(hr)) 
{
    return hr;
}
 

デバイスが排他協調レベルで取得された状態にあれば、デフォルトでは、このエフェクトは生成されると同時にデバイスにダウンロードされることに注意する。これをコンパイルして実行し、発射ボタンを押すと、燃料の切れたチェーンソーがプスプスいう様子を感じることができる。

エフェクト オブジェクトを作成したら、「ステップ 5 : 無限エフェクトの再生」に進む。