4.8 KiB
4.8 KiB
InputManager
命名空间: XCEngine::Input
类型: class (singleton)
头文件: XCEngine/Input/InputManager.h
描述: 保存当前输入状态、提供轮询查询接口,并同步广播输入事件。
概述
InputManager 是 XCEngine 当前输入系统的核心入口。平台层通过 ProcessKeyDown、ProcessMouseMove 等方法把原始输入送进来;游戏代码、编辑器和测试代码则通过 IsKeyDown、GetAxis、OnKeyEvent 等 API 查询或订阅这些状态。
它同时承担两种角色:
- 轮询中心:保存“当前是否按下”“本帧是否刚按下”“本帧鼠标位移”等状态。
- 事件中心:把输入变化同步广播给订阅者。
生命周期
- Get 返回进程级单例。
- Initialize 分配内部状态数组、保存窗口句柄并注册默认轴/按钮。
- Shutdown 清空状态和映射,但当前不会清空事件监听器。
- Update 用于推进帧边界并清理瞬时状态。
默认映射
当前 Initialize 会注册以下默认逻辑项:
- 轴:
Horizontal(D/A)、Vertical(W/S) - 轴:
Mouse X、Mouse Y,但两者当前都绑定为KeyCode::None,因此GetAxis结果始终为0 - 按钮:
Jump(Space)、Fire1(LeftCtrl)、Fire2(LeftAlt)、Fire3(LeftShift)
线程语义
- 当前实现没有锁,也不是为多线程输入注入设计的。
Process*、Update、注册映射和查询最好都在主线程或同一逻辑线程完成。- 事件回调同步执行在调用
Process*的线程上。
当前实现限制
platformWindowHandle会被保存,但InputManager当前并不直接使用它。KeyCode数值存在重复项,而InputManager用原始枚举值索引固定数组,因此部分按键状态会别名冲突。GetAxisRaw当前按“按下这一帧”计算,而不是按“持续按住”计算。GetButtonUp对未注册按钮返回true。ClearAxes会同时清空m_axes和m_buttons。- 触摸接口已暴露,但当前实现没有任何公开路径去填充
m_touches。
公开方法
| 方法 | 说明 |
|---|---|
| Get | 获取全局 InputManager 实例。 |
| Initialize | 初始化输入状态和默认映射。 |
| Shutdown | 清空输入状态与映射。 |
| Update | 推进帧边界并清理瞬时状态。 |
| IsKeyDown | 查询键是否处于按下状态。 |
| IsKeyUp | 查询键是否处于抬起状态。 |
| IsKeyPressed | 查询键是否在本帧刚被按下。 |
| GetMousePosition | 读取当前鼠标位置。 |
| GetMouseDelta | 读取本帧鼠标位移。 |
| GetMouseScrollDelta | 读取本帧滚轮增量。 |
| IsMouseButtonDown | 查询鼠标按键是否按下。 |
| IsMouseButtonUp | 查询鼠标按键是否抬起。 |
| IsMouseButtonClicked | 查询鼠标按键是否在本帧刚被按下。 |
| GetTouchCount | 读取触点数量。 |
| GetTouch | 读取指定触点状态。 |
| GetAxis | 读取具名逻辑轴。 |
| GetAxisRaw | 读取具名逻辑轴的当前原始值。 |
| GetButton | 查询具名按钮当前是否按下。 |
| GetButtonDown | 查询具名按钮是否在本帧刚按下。 |
| GetButtonUp | 查询具名按钮是否处于抬起状态。 |
| RegisterAxis | 注册或覆盖一个具名轴。 |
| RegisterButton | 注册或覆盖一个具名按钮。 |
| ClearAxes | 清空轴和按钮映射。 |
| OnKeyEvent | 获取键盘事件通道。 |
| OnMouseButton | 获取鼠标按键事件通道。 |
| OnMouseMove | 获取鼠标移动事件通道。 |
| OnMouseWheel | 获取鼠标滚轮事件通道。 |
| OnTextInput | 获取文本输入事件通道。 |
| ProcessKeyDown | 注入按键按下事件。 |
| ProcessKeyUp | 注入按键抬起事件。 |
| ProcessMouseMove | 注入鼠标移动事件。 |
| ProcessMouseButton | 注入鼠标按键事件。 |
| ProcessMouseWheel | 注入鼠标滚轮事件。 |
| ProcessTextInput | 注入文本输入事件。 |