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