使用本主题可以了解键盘和鼠标特有的使用方法。 键盘和鼠标是本地输入 GameInput
键盘输入
GetKeyState 方法为键盘上每个按下的键检索扫描代码和虚拟键数据。 然后,此输入数据作为 GameInputKeyState 结构的可变长度数组返回。 按下的键是键盘报告输入时按下的键。 键盘报告输入的频率各不相同,通常介于 125Hz 到 1000Hz 之间。 对于连接到系统的每个键盘,单独报告键盘状态。 可使用 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
值是所有移动增量的总和。 这些值与屏幕空间坐标没有任何关系。 累积增量值仅适用于进程具有输入焦点时接收的鼠标事件。
用户关联
目前,键盘和鼠标不支持用户关联。 没有可用于将其中任一外设映射到用户的界面。