Platform SDK: DirectX |
入力データが発生しているかどうかを確認するには、ポーリングとイベント通知という 2 つの方法がある。
デバイスのポーリングとは、デバイス オブジェクトの現在の状態を定期的に取得すること、またはイベント バッファの内容をチェックすることを意味する。ポーリングが使用されるのは通常、決してアイドルになることがなく、常にゲームの世界を更新、レンダリングするリアルタイム ゲームである。
C++ アプリケーションでのポーリングは通常、メッセージ ループ内で行われる。
イベント通知は、Scrawl サンプルのように、何もしないで入力を待つようなアプリケーションに向いている。イベント通知を使用するには、Win32 CreateEvent 関数でスレッド同期オブジェクトをセットアップした後、イベントのハンドルを IDirectInputDevice7::SetEventNotification メソッドに渡すことによって、このイベントとデバイスを関係付ける。これで、デバイスの状態が変化するたびに、DirectInput によってイベントが通知される。アプリケーションは、WaitForSingleObject などの Win32 関数を使用して、イベントの通知を受け取った後、入力バッファをチェックして何のイベントかを確認し、応答することができる。サンプル コードについては、「Scrawl サンプル」および「IDirectInputDevice7::SetEventNotification」を参照すること。
ジョイスティックやほかのゲーム デバイス、またはこれらのデバイス上のオブジェクトのうちいくつかは、IDirectInputDevice7::Poll メソッドを呼び出すまで、ハードウェア割り込みを生成せず、いかなるデータも返さず、いかなるイベントも送信しない(このようなバックグラウンドでのポーリングを、ここで説明するアプリケーション ポーリングと混同しないこと。Poll メソッドは、データを一切取得しないが、データを使用可能にすることがある)。
データを取得しようとするたびに Poll メソッドを呼び出す必要があるかどうかを調べるには、まずデバイスのデータ形式を設定し、IDirectInputDevice7::GetCapabilities メソッドを呼び出して、DIDEVCAPS 構造体の DIDC_POLLEDDATAFORMAT フラグをチェックする。
DIDC_POLLEDDATAFORMAT フラグと DIDC_POLLEDDEVICE フラグを混同しないこと。後者は、デバイス上のオブジェクトのいずれかがポーリングを必要としているときに設定されるフラグである。次に、IDirectInputDevice7::GetObjectInfo メソッドを呼び出し、DIDEVICEOBJECTINSTANCE 構造体にある DIDOI_POLLED フラグをチェックすると、ポーリングを必要としているのが特定のオブジェクトであるかどうかを見分けることができる。
DIDC_POLLEDDEVICE フラグはデバイスの最悪の状態を表すのであって、デバイスの実際の状態を表すのではない。たとえば、ソフトウェア解像度調節付きの HID マウスの場合、解像度情報を読み取るためにポーリングを要求するので、DIDC_POLLEDDEVICE フラグが設定される。デバイスの標準ボタンと軸データ以外は必要ない場合、このような条件のもとでデバイスをポーリングすることは、無意味である。
ただし、IDirectInputDevice7::Poll メソッドを呼び出しても、入力デバイスに障害を与えることはない。この呼び出しが不要なときは、何のエフェクトも持たずにすぐに終了する。
Visual Basic アプリケーションでは、ポーリングは通常、Sub Main プロシージャ内で行われる。
イベント通知は、ScrawlB サンプルのように、何もしないで入力を待つようなアプリケーションに向いている。イベント通知を使用するには、データを取得するフォームまたはモジュールに DirectXEvent を実装する。次に、DirectX7.CreateEvent を使ってイベント ハンドルを作成し、このハンドルを DirectInputDevice.SetEventNotification に渡す。これで、デバイスで入力イベントが発生すると必ず DirectXEvent.DXCallback メソッドが呼び出され、Sub Main 内と同様に、このメソッドの実装内で、デバイスの状態またはバッファリング データのどちらかを取得できる。
ジョイスティックやほかのゲームデバイス、またはこれらのデバイス上のオブジェクトのうちいくつかは、DirectInputDevice.Poll メソッドを呼び出すまで、ハードウェア割り込みを生成せず、いかなるデータも返さず、いかなるイベントも送信しない(このようなバックグラウンドでのポーリングを、ここで説明するアプリケーション ポーリングと混同しないこと。Poll メソッドは、データを一切取得しないが、データを使用可能にすることがある)。
データを取得しようとするたびに Poll メソッドを呼び出す必要があるかどうかを調べるには、まずデバイスのデータ形式を設定し、次に DirectInputDevice.GetCapabilities メソッドを呼び出して、DIDEVCAPS 型の DIDC_POLLEDDATAFORMAT フラグをチェックする。
DIDC_POLLEDDATAFORMAT フラグと DIDC_POLLEDDEVICE フラグを混同しないこと。後者は、デバイス上のオブジェクトのどれかがポーリングを必要としているときに設定されるフラグである。次に、IDirectInputDevice7::GetObjectInfo メソッドを呼び出して DirectInputDeviceObjectInstance オブジェクトを取得し、DirectInputDeviceObjectInstance.GetFlags により返される値中の DIDOI_POLLED フラグをチェックすると、ポーリングを必要としているのが特定のオブジェクトであるかどうかを見分けることができる。
DIDC_POLLEDDEVICE フラグはデバイスの最悪の状態を表すのであって、デバイスの実際の状態を表すのではない。たとえば、ソフトウェア解像度調節付きの HID マウスでは、解像度情報を読み取るためにポーリングを要求するので、DIDC_POLLEDDEVICE フラグが設定される。デバイスの標準ボタンと軸データ以外は必要ない場合は、このような条件のもとでデバイスをポーリングすることは、無意味である。
ただし、Poll メソッドを呼び出しても、入力デバイスに障害を与えることはない。この呼び出しが不要なときは、何のエフェクトも持たずにすぐに終了する。