ステップ 4 :ジョイスティックの動作の設定
ステップ 4 :ジョイスティックの動作の設定
これまでに、ジョイスティック デバイスの作成とデバイスのデータ形式の設定が完了している。次の手順は、デバイスの協調レベルの設定である。前の手順と同様に、g_pJoystick はデバイス インターフェイスへのポインタである。
if (FAILED(hr = g_pJoystick->SetCooperativeLevel(hDlg,
DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
return hr;
IDirectInputDevice8::SetCooperativeLevel の最初の引数はウィンドウのハンドルである。この例では、メイン プログラム ウィンドウとなるダイアログ ボックスへのハンドルが関数に渡される。
最後の引数は、必要な協調レベルを指定するフラグの組み合わせである。Joystick サンプルは、このサンプルがフォアグラウンド アプリケーションの場合、ジョイスティックからの入力のみを要求する。また、ジョイスティック サンプルがフォアグラウンドの場合、このアプリケーションがジョイスティックに排他的にアクセスする唯一のアプリケーションでなければならない。したがって、フラグは DISCL_EXCLUSIVE | DISCL_FOREGROUND に設定される。これらのフラグの詳細については、「協調レベル」を参照すること。
次の手順では、ジョイスティックの能力に関する情報を収集する。この情報には、軸やボタンなどのコントローラの数、フォース フィードバックのサポート、およびジョイスティックの動作やサポート オプションに関するその他の詳細が含まれる。
DIDEVCAPS 構造体は、能力情報の保持に使われる。まず、DIDEVCAPS 構造体の dwSize メンバを初期化し、次に、その構造体のアドレスが IDirectInputDevice8::GetCapabilities に送られる。次の例では、g_diDevCaps は以前に宣言した DIDEVCAPS 構造体である。
g_diDevCaps.dwSize = sizeof(DIDEVCAPS);
if (FAILED(hr = g_pJoystick->GetCapabilities(&g_diDevCaps)))
return hr;
この時点で、デバイスのデフォルトを使うことも、デバイス プロパティをカスタマイズすることもできる。Joystick サンプルは、ジョイスティックの軸を列挙し、IDirectInputDevice8::EnumObjects を呼び出して、各軸の範囲を設定する。
if (FAILED(hr = g_pJoystick->EnumObjects(EnumAxesCallback,
(VOID*)hDlg, DIDFT_AXIS)))
return hr;
IDirectInputDevice8::EnumObjects メソッドの最初の引数 EnumAxesCallback は、列挙されたオブジェクトを必要に応じて処理するコールバック関数のアドレスである。
第 2 引数は、コールバック関数が使える任意の 32 ビット値である。ここでメイン ダイアログ ウィンドウへのハンドルを渡して表示を更新し、ジョイスティックにどの軸があるかを示すことができる。
最後の引数 DIDFT_AXIS は、コールバック関数にデバイスの軸だけを列挙するよう指定する。
このサンプルでは、変更されたプロパティは、検出された軸またはスライダの範囲である (スライダは軸と見なされる)。
範囲を設定することにより、軸に対して返す最大値と最小値を Microsoft® DirectInput® に指示することになる。例のように、x 軸に対して範囲 -1,000 ~ +1,000 を設定すると、ジョイスティックが最左端にある場合には -1,000、最右端にある場合には +1,000、中央にある場合には 0 を返すことを、それぞれ要求することになる。
次のサンプル コードは、列挙する軸の範囲を設定する。変数 pdidoi は、システムがコールバック関数に渡す DIDEVICEOBJECTINSTANCE 構造体のアドレスである。この変数には、現在列挙されようとしているオブジェクトに関する情報が格納されている。
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType;
diprg.lMin = -1000;
diprg.lMax = +1000;
.
.
hr = g_pJoystick->SetProperty(DIPROP_RANGE, &diprg.diph);
if (FAILED(hr))
return DIENUM_STOP;
ここでは最初に、DIPROPRANGE 構造体 diprg を設定する。その構造体のアドレスは、IDirectInputDevice8::SetProperty メソッドに渡される。実際には、構造体自体のアドレスが渡されるのではなく、その最初のメンバのアドレスが渡される。最初のメンバは、1 つの DIPROPHEADER 構造体である。詳細については、「デバイス プロパティ」を参照すること。
プロパティ ヘッダーは、次の値で初期化される。
- プロパティ構造体のサイズ。
- ヘッダー構造体のサイズ。
- dwObj メンバの解釈方法を示すフラグ。
- DIDEVICEOBJECTINSTANCE 構造体の dwType メンバにある値は、プロパティを変更中のオブジェクトを示す。
DIPROPRANGE 構造体の lmin と lmax メンバに必要な範囲値を割り当てる。
アプリケーションは、ここで IDirectInputDevice8::SetProperty メソッドを呼び出す。最初の引数は、どのプロパティを変更するのかを示すフラグである。第 2 引数は、プロパティ構造体の DIPROPHEADER メンバのアドレスである。
ジョイスティックの動作を設定したら、「ステップ 5 :ジョイスティックへのアクセス権の取得」に進むこと。