Microsoft DirectX 8.0 (C++) |
エフェクトの列挙後 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 : 無限エフェクトの再生」に進む。