游戏输入控制器(GameInputController)
相关源文件
- Adventure-King/Classes/Configs/GameSceneConfig.h
- Adventure-King/Classes/GameUI.cpp
- Adventure-King/Classes/GameUI.h
- Adventure-King/Classes/Scenes/GameInputController.cpp
- Adventure-King/Classes/Scenes/GameInputController.h
- Adventure-King/Classes/Scenes/GameUIController.cpp
- Adventure-King/Classes/Scenes/GameUIController.h
- Adventure-King/Resources/Scene/UI/bag.png
- Adventure-King/Resources/Scene/UI/bagSelected.png
目的与范围
GameInputController 负责在游戏过程中处理键盘输入,并把它翻译为玩家动作。该控制器处理移动、战斗、跳跃与 UI 指令,同时尊重暂停状态、动作锁与上下文敏感交互。它充当原始键盘事件与 PlayerCharacter 实体之间的桥梁:在维护物理驱动移动所需的输入状态的同时,将动作委托给玩家实体执行。
UI 状态管理(暂停/背包/死亡菜单)请参见 GameUIController。输入优先级规则与上下文敏感行为请参见 Input Priority and Context。
来源:Classes/Scenes/GameInputController.h L1-L78
Classes/Scenes/GameInputController.cpp L1-L306
架构概览
下图展示 GameInputController 在输入处理管线中的位置:
输入状态字段
| 字段 | 类型 | 来源 | 含义 |
|---|---|---|---|
_movingLeft / _movingRight | bool | Frame | 是否按住左右移动键 |
_runPressed | bool | Frame | 是否按住冲刺键(Shift) |
_grounded | bool | Physics | 是否站在地面上 |
_groundContactCount | int | Physics | 当前地面接触计数 |
_jumpCount | int | Physics | 自上次落地以来的跳跃次数 |
来源:Classes/Scenes/GameInputController.h L59-L67
初始化顺序
- 在
GameScene中实例化GameInputController - 调用
bindPlayer(player)绑定玩家实体 - 调用
setPauseToggle()、setInventoryToggle()等绑定回调 - 挂载键盘事件监听器,调用
onKeyPressed()/onKeyReleased() - 在场景 update 循环中注册
update(dt) - 在物理接触监听器中注册
onGroundContactBegin()/onGroundContactEnd()
来源:Classes/Scenes/GameInputController.h L18-L48
与 GameUIController 的集成
GameInputController 与 GameUIController 的分工边界清晰:
| 控制器 | 职责 | 关键方法 |
|---|---|---|
| GameInputController | 原始输入 → 玩法动作 | onKeyPressed(), update() |
| GameUIController | UI 状态管理 | togglePauseMenu(), showDeathMenu() |
图示:控制器职责分离
输入控制器会读取 UI 状态(暂停/死亡菜单标记),但不修改该状态。所有 UI 状态变化都通过 GameUIController 的方法发生。这种单向依赖能避免循环状态变更。
来源:Classes/Scenes/GameUIController.h L16-L83
Classes/Scenes/GameInputController.h L15-L78
配置
输入相关常量
移动与跳跃参数定义在 GameConfig::Player 中:
| 常量 | 值 | 用途 |
|---|---|---|
WALKSPEED | (见配置) | 基础移动速度 |
RUNSPEED | (见配置) | Shift 修饰后的移动速度 |
JUMP_IMPULSE | (见配置) | 垂直跳跃力度 |
MAX_JUMP_COUNT | (见配置) | 多段跳上限 |
GROUND_VELOCITY_THRESHOLD | (见配置) | 判定落地的 Y 速度阈值 |
GROUND_NORMAL_THRESHOLD | (见配置) | 接触法线过滤阈值(-0.7) |
来源:Classes/Scenes/GameInputController.cpp L13-L16
总结
GameInputController 实现了一个“有状态”的输入处理器,它:
- 把键盘事件翻译为动作:通过委托调用玩家动作接口
- 维护移动状态:以支持物理驱动的连续运动
- 尊重暂停状态:阻断玩法输入(但不阻断 UI 输入)
- 跟踪地面接触:用引用计数处理多接触点场景
- 提供上下文敏感行为:通过回调查询交互环境
- 持续同步动画状态:在 update 与战斗动作后保持正确状态
- 职责分离:UI 状态由
GameUIController管理,输入层只消费状态
该控制器是较薄的“翻译层”:仅做最少逻辑,把验证/执行委托给 PlayerCharacter 与回调函数,从而保持输入处理与游戏逻辑、UI 状态管理之间的解耦。