GameInput のキーボードとマウス
このトピックでは、キーボードとユーザー固有の使い方について説明します。 キーボードとマウスは、GameInput
へのネイティブな入力です。
キーボード入力
GetKeyState メソッドは、キーボードで押された各キーのスキャン コードと仮想キーのデータを取得します。 その後、この入力データは、GameInputKeyState 構造体の可変長配列として返されます。 押されたキーとは、キーボードが入力を報告した時点で押されているキーです。 キーボードが入力を報告する頻度はさまざまであり、通常は 125Hz から1,000 Hz の範囲です。 キーボードの状態は、システムに接続されている個々のキーボードごとに個別に報告されます。 IGameInput インターフェイスの CreateAggregateDevice メソッドを使用して、システム キーボードの結合された状態を取得します。
キーボードの基本的な状態は、キーボード入力をゲームのアクション (移動や武器の発射など) にマップするためのものです。 通常のテキスト入力のためのものではありません。この目的には他の API を使います。
キーの状態の読み取り
タイトルにキーボードおよびマウスの GameInput
を実装するには、次のコードを使用します。
uint32_t GetKeyState(
uint32_t stateArrayCount,
GameInputKeyState* stateArray
)
typedef struct GameInputKeyState
{
uint32_t scanCode;
uint32_t codePoint;
uint8_t virtualKey;
bool isDeadKey;
} GameInputKeyState;
各キーの状態は、配列内の固定インデックスには格納されません。 代わりに、配列内の有効な要素の数はキーが押されると増加します。 キーが離されると、配列は縮小します。 新しいキーは配列の最後に追加され、キーを離したときにすべてが下にシフトされてギャップが埋められます。
GetKeyCount は、次のコードに示すように、押されたキーの数を返します。 これを使うと、GetKeyState 割り当てる配列の大きさが決まります。
GetKeyState
に渡された stateArray
が押されたキーの数よりも大きい場合、余った配列要素が書き込まれたり、ゼロ設定されたりすることはありません。逆に、stateArray
が押されたキーの数よりも小さい場合は、配列がいっぱいになり、余った押されたキーは失われます。
uint32_t GetKeyCount()
標準キーボードでは、一度に報告できるキー押下は 4 から 6 個であり、ハイエンドのゲーム キーボードでも一度に 12 から 16 個を超えるキーがサポートされることはほとんどありません。 そのため、GetKeyCount
を使うと、配列の最大サイズが小さく維持されます。 最大サイズは、 IGameInputDevice インターフェイスを使用して照会できます。
codePoint
メンバーは、現在のキーボード レイアウトに基づいて、システムが認識しているグリフが関連するキーキャップに印字されていることを示します。 これは、テキスト入力の文字列を作成するためではなく、入力マッピング インターフェイスでのキーの表現の表示を目的としています。
マウス入力
GetMouseState メソッドは、マウスの動きとボタンの状態を取得します。これは、次のコードに示すように、単一の GameInputMouseState 構造体で返されます。 キーボードの状態と同様に、マウスの状態はシステムに接続されている個々のマウスごとに個別に報告されます。
bool GetMouseState(
GameInputMouseState* state
)
typedef struct GameInputMouseState
{
GameInputMouseButtons buttons;
int64_t positionX;
int64_t positionY;
int64_t wheelX;
int64_t wheelY;
} GameInputMouseState;
typedef enum GameInputMouseButtons
{
GameInputMouseNone = 0x00000000,
GameInputMouseLeftButton = 0x00000001,
GameInputMouseRightButton = 0x00000002,
GameInputMouseMiddleButton = 0x00000004,
GameInputMouseButton4 = 0x00000008,
GameInputMouseButton5 = 0x00000010,
GameInputMouseWheelTiltLeft = 0x00000020,
GameInputMouseWhelTiltRight = 0x00000040
} GameInputMouseButtons;
マウスの動きの読み取り
マウスの動きは、絶対位置ではなく、一連のデルタ値としてネイティブに報告されます。 マウスの現在の読み取り値を定期的に要求すると、複数の中間デルタを見逃す可能性が高いので、これは GetCurrentReading
のポーリングの性質に適合していません。
GetNextReading を使用して、数十個になる可能性があるマウスの読み取り値の履歴をたどり、デルタを合計するのではなく、positionX
と positionY
の仮想値に累積されます。 その後、デルタは、取得済みの以前の読み取り値から positionX
と positionY
の値を減算することによって計算されます。 個々のデルタは、すべての中間読み取り値を反復処理したとき、または中間読み取り値がスキップされたときの累積デルタを通じてアクセスできます。
positionX
と positionY
の値は、動きのすべてのデルタの合計です。 これらの値は、画面空間の座標とはまったく相関していません。 累積デルタ値は、プロセスに入力フォーカスがある間にプロセスが受け取るマウス イベントのみを対象としています。
ユーザーの関連付け
現在、ユーザーの関連付けはキーボードとマウスでサポートされていません。 これらの周辺機器のいずれかをユーザーにマップするためのインターフェイスはありません。