Microsoft DirectX 8.0 (C++)

ステップ 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;

EnumObjects メソッドの最初のパラメータ EnumAxesCallback は、列挙されたオブジェクトを必要に応じて処理するコールバック関数のアドレスである。

第 2 パラメータは、コールバック関数が使用できる任意の 32 ビット値である。ここでメイン ダイアログ ウィンドウへのハンドルを渡して表示を更新し、ジョイスティックにどの軸があるかを示すことができる。

最後のパラメータ DIDFT_AXIS は、コールバック関数にデバイスの軸だけを列挙するよう指定する。

サンプルでは、変更されたプロパティは、検出された軸またはスライダの範囲である (スライダは軸と見なされる) 。

範囲を設定することにより、返させたい軸の最大値と最小値が何であるかを 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 構造体である。詳細については、「デバイス プロパティ」を参照すること。

プロパティ ヘッダーは、以下の値で初期化される。

DIPROPRANGE 構造体の lmin lmax メンバに必要な範囲値を割り当てる。

アプリケーションは、ここで IDirectInputDevice8::SetProperty メソッドを呼び出す。最初のパラメータは、どのプロパティを変更するのかを示すフラグである。第 2 パラメータは、プロパティ構造体の DIPROPHEADER メンバのアドレスである。

ジョイスティックの動作を設定したら、「ステップ 5 : ジョイスティックへのアクセス権の取得」に進む。