Platform SDK: DirectX

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

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectInput Visual Basic チュートリアル」を参照すること。

[C++]

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

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

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

まず、列挙されたエフェクトそれぞれについて 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 を取得するために、次のように IDirectInputDevice7::EnumEffects メソッドを呼び出し、コールバックをスタートさせる。

HRESULT  hr;
GUID     guidEffect;
 
hr = g_lpdid7->EnumEffects( 
     (LPDIENUMEFFECTSCALLBACK) DIEnumEffectsProc,
     &guidEffect, 
     DIEFT_PERIODIC);
if (FAILED(hr))
  {
  OutputDebugString("エフェクトの列挙に失敗しました。\n");
  // 注意 : 成功したといっても、どれかのエフェクトが発見されたということを意味するわけではなく、
  // 単に処理がスムーズに行われたことを意味する。
  }
 

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

次項 : ステップ 4 : エフェクトの生成