GameInput 中的键盘和鼠标

使用本主题可以了解键盘和鼠标特有的使用方法。 键盘和鼠标是 GameInput 的本机输入。

同时连接多个设备时,GameInput 会为键盘和鼠标输入创建唯一的设备。 如果需要,游戏可以管理唯一键盘和鼠标。 更常见的用例是将所有键盘或鼠标输入组合为一个系统状态。 可使用 CreateAggregateDevice 来完成此操作,它将结合输入,使游戏只处理一个虚拟键盘和鼠标。 有关详细信息,请参阅 IGameInputDevice

有关设备和输入读数在 GameInput 中如何工作的更多信息,请参阅 GameInput 读取GameInput 设备

注意

目前不支持 CreateAggregateDevice

键盘输入

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 分配多大的数组。 如果传递给 GetKeyStatestateArray 大于按下的键的数目,则不会写出或取消多余的数组元素。相反,如果 stateArray 小于按下的键的数目,则填充数组,并丢失多余的按下的键。

uint32_t GetKeyCount()  

标准键盘只能一次报告 4 到 6 个按键,即使高端的游戏键盘也很少支持一次报告超过 12-16 个键。 因此,使用 GetKeyCount 可使数组的最大大小较小。 可通过 IGameInputDevice 界面查询最大大小。

请注意,codePoint 成员根据当前的键盘布局指定系统认为印在相关键帽上的字形。 它旨在在输入映射界面中显示键的表示形式,而不用是生成文本输入的字符串。

鼠标输入

GetMouseState 方法检索鼠标的移动和按钮状态,它以单独的 GameInputMouseState 结构返回,如以下代码所示。 类似于键盘状态,对于连接到系统的每个鼠标,单独报告鼠标状态。 与键盘输入一样,可使用 IGameInput 界面上的 CreateAggregateDevice 方法获取系统鼠标状态。

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 遍历潜在的数十个历史鼠标读数并累加增量,它们被累积为虚拟的 positionXpositionY 值。 从那里,可以通过从之前获得的读数中减去 positionXpositionY 值来计算增量。 遍历所有中间读数时可以访问各个增量,或者在跳过中间读数时可以通过累积的增量进行访问。

positionXpositionY 值是所有移动增量的总和。 这些值与屏幕空间坐标没有任何关系。 累积增量值仅适用于进程具有输入焦点时接收的鼠标事件。

用户关联

目前,键盘和鼠标不支持用户关联。 没有可用于将其中任一外设映射到用户的界面。

另请参阅

GameInput 读取

GameInput 设备

高级 GameInput 主题

输入 API 参考