2026-03-26 16:45:24 +08:00
|
|
|
|
# InputManager::IsKeyUp
|
|
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
查询一个键当前是否处于抬起状态。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
bool IsKeyUp(KeyCode key) const;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
## 行为说明
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-04-08 16:07:03 +08:00
|
|
|
|
当前实现直接把它定义成“不是 Down”:
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
- 如果管理器未初始化,返回 `true`
|
|
|
|
|
|
- 否则返回 `!IsKeyDown(key)`
|
2026-04-08 16:07:03 +08:00
|
|
|
|
- 如果 `KeyCode` 超出内部数组范围,`IsKeyDown()` 会返回 `false`,因此这里也会表现为 `true`
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-04-08 16:07:03 +08:00
|
|
|
|
因此对于未初始化、越界或当前未按住的键,它都会被视为 “Up”。
|
|
|
|
|
|
|
|
|
|
|
|
这和 [IsKeyReleased](IsKeyReleased.md) 要区分开:
|
|
|
|
|
|
|
|
|
|
|
|
- `IsKeyUp()` 回答的是“现在有没有按住”
|
|
|
|
|
|
- `IsKeyReleased()` 回答的是“这一帧是否刚释放”
|
|
|
|
|
|
|
|
|
|
|
|
如果你要做“松开键就触发一次”这类逻辑,应优先使用释放边沿接口,而不是用 `IsKeyUp()` 轮询。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
## 参数
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
- `key` - 要查询的键。
|
|
|
|
|
|
|
|
|
|
|
|
## 返回值
|
|
|
|
|
|
|
|
|
|
|
|
- `bool` - 当前是否抬起。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
2026-04-08 16:07:03 +08:00
|
|
|
|
## 示例
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
if (XCEngine::Input::InputManager::Get().IsKeyUp(XCEngine::Input::KeyCode::Space)) {
|
|
|
|
|
|
// Space 当前没有被按住
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-26 16:45:24 +08:00
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
2026-03-26 17:39:53 +08:00
|
|
|
|
- [返回类型总览](InputManager.md)
|
|
|
|
|
|
- [IsKeyDown](IsKeyDown.md)
|
2026-04-08 16:07:03 +08:00
|
|
|
|
- [IsKeyReleased](IsKeyReleased.md)
|