ShitEngine 1.4.2
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
Input.h
浏览该文件的文档.
1#pragma once
2
3#include "../Core/Core.h"
4#include "../Math.h"
5#include "KeyCode.h"
6
7#include <array>
8#include <string>
9#include <unordered_map>
10#include <vector>
11
12union SDL_Event;
13
14namespace Shit {
39 class SHIT_API Input {
40 public:
41 // --- 底层:键盘 ---
42 bool isKeyDown(KeyCode code) const;
43 bool isKeyPressed(KeyCode code) const;
44 bool isKeyReleased(KeyCode code) const;
45
46 // --- 底层:鼠标 ---
52
53 // --- 动作映射(settings.json → inputMappings.actions)---
54 bool isActionDown(const std::string& action) const;
55 bool isActionPressed(const std::string& action) const;
56 bool isActionReleased(const std::string& action) const;
57
58 // --- 轴映射(settings.json → inputMappings.axes)---
59 float getAxis(const std::string& axis) const;
60
61 // --- 生命周期 ---
62 void initMappings();
63 void update();
64 void handleEvent(const SDL_Event& event);
66 void setMousePosition(const Vector2& position);
68 void resetState();
69
70 // --- 静态门面 ---
71 static Input& GetInstance();
72
73 static bool IsKeyDown(KeyCode code) { return GetInstance().isKeyDown(code); }
74 static bool IsKeyPressed(KeyCode code) { return GetInstance().isKeyPressed(code); }
75 static bool IsKeyReleased(KeyCode code) { return GetInstance().isKeyReleased(code); }
76
77 static bool IsMouseButtonDown(MouseButton code) { return GetInstance().isMouseButtonDown(code); }
78 static bool IsMouseButtonPressed(MouseButton code) { return GetInstance().isMouseButtonPressed(code); }
79 static bool IsMouseButtonReleased(MouseButton code) { return GetInstance().isMouseButtonReleased(code); }
80 static Vector2 GetMousePosition() { return GetInstance().getMousePosition(); }
81 static Vector2 GetMouseScroll() { return GetInstance().getMouseScroll(); }
82
83 static bool IsActionDown(const std::string& action) { return GetInstance().isActionDown(action); }
84 static bool IsActionPressed(const std::string& action) { return GetInstance().isActionPressed(action); }
85 static bool IsActionReleased(const std::string& action) { return GetInstance().isActionReleased(action); }
86 static float GetAxis(const std::string& axis) { return GetInstance().getAxis(axis); }
87
88 static void InitMappings() { GetInstance().initMappings(); }
89 static void Update() { GetInstance().update(); }
90 static void HandleEvent(const SDL_Event& event) { GetInstance().handleEvent(event); }
91 static void SetMousePosition(const Vector2& position) { GetInstance().setMousePosition(position); }
92 static void ResetState() { GetInstance().resetState(); }
93
94 private:
95 friend class EngineContext;
96 enum class BindingType { Key, Mouse };
97
98 struct CompiledBinding {
99 BindingType type = BindingType::Key;
102 };
103
104 struct CompiledAction {
105 std::vector<CompiledBinding> bindings;
106 };
107
108 struct CompiledAxis {
109 std::vector<CompiledBinding> negative;
110 std::vector<CompiledBinding> positive;
111 };
112
113 Input();
114 ~Input();
115
116 Input(const Input&) = delete;
117 Input& operator=(const Input&) = delete;
118 Input(Input&&) = delete;
119 Input& operator=(Input&&) = delete;
120
121 // 解析配置键名 → 编译后绑定;失败返回 false 并打 WARN
122 bool compileBinding(const std::string& name, CompiledBinding& out) const;
123 static KeyCode parseKeyCode(const std::string& name);
124 static MouseButton parseMouseButton(const std::string& name);
125 static std::string normalizeKeyName(const std::string& name);
126
127 bool isBindingDown(const CompiledBinding& b) const;
128 bool isBindingPressed(const CompiledBinding& b) const;
129 bool isBindingReleased(const CompiledBinding& b) const;
130
131 bool anyBindingDown(const std::vector<CompiledBinding>& bindings) const;
132 bool anyBindingPressed(const std::vector<CompiledBinding>& bindings) const;
133 bool anyBindingReleased(const std::vector<CompiledBinding>& bindings) const;
134
135 // 底层状态
136 std::array<bool, static_cast<int>(KeyCode::Count)> m_currentKeys{};
137 std::array<bool, static_cast<int>(KeyCode::Count)> m_previousKeys{};
138 std::array<bool, static_cast<int>(MouseButton::Count)> m_currentMouseButtons{};
139 std::array<bool, static_cast<int>(MouseButton::Count)> m_previousMouseButtons{};
140 Vector2 m_mouseScroll{ 0.0f, 0.0f };
141 Vector2 m_injectedMousePosition{ 0.0f, 0.0f };
142 bool m_hasInjectedMousePosition = false;
143
144 // 预编译映射
145 std::unordered_map<std::string, CompiledAction> m_actions;
146 std::unordered_map<std::string, CompiledAxis> m_axes;
147 bool m_mappingsReady = false;
148 };
149}
#define SHIT_API
定义 Core.h:14
static bool IsMouseButtonDown(MouseButton code)
定义 Input.h:77
static bool IsKeyPressed(KeyCode code)
定义 Input.h:74
static void SetMousePosition(const Vector2 &position)
编辑器注入逻辑坐标(隐藏窗口下 SDL 轮询不到真实鼠标)
定义 Input.h:91
bool isKeyDown(KeyCode code) const
void initMappings()
从 Config 预编译动作/轴绑定(ConfigInit 之后调用)
bool isActionPressed(const std::string &action) const
static bool IsKeyReleased(KeyCode code)
定义 Input.h:75
static void ResetState()
清空键鼠快照与注入坐标(进入运行态时调用)
定义 Input.h:92
static Input & GetInstance()
static bool IsActionReleased(const std::string &action)
定义 Input.h:85
Vector2 getMouseScroll() const
static void Update()
定义 Input.h:89
bool isMouseButtonPressed(MouseButton code) const
void setMousePosition(const Vector2 &position)
注入鼠标逻辑坐标(编辑器进程内嵌时由宿主转发 Qt 事件坐标)
static bool IsKeyDown(KeyCode code)
定义 Input.h:73
void resetState()
清空键鼠三态快照与注入坐标(进入运行态时调用,防遗留按住状态)
static void InitMappings()
定义 Input.h:88
bool isKeyReleased(KeyCode code) const
bool isKeyPressed(KeyCode code) const
bool isActionReleased(const std::string &action) const
float getAxis(const std::string &axis) const
bool isMouseButtonDown(MouseButton code) const
static bool IsActionDown(const std::string &action)
定义 Input.h:83
Vector2 getMousePosition() const
static Vector2 GetMousePosition()
定义 Input.h:80
void handleEvent(const SDL_Event &event)
void update()
帧末:current → previous
static bool IsActionPressed(const std::string &action)
定义 Input.h:84
bool isMouseButtonReleased(MouseButton code) const
friend class EngineContext
定义 Input.h:95
static bool IsMouseButtonPressed(MouseButton code)
定义 Input.h:78
static bool IsMouseButtonReleased(MouseButton code)
定义 Input.h:79
static float GetAxis(const std::string &axis)
定义 Input.h:86
static void HandleEvent(const SDL_Event &event)
定义 Input.h:90
bool isActionDown(const std::string &action) const
static Vector2 GetMouseScroll()
定义 Input.h:81
定义 AnimationClip.h:12
MouseButton
鼠标按键码(左/右/中键 + 两个侧键)
定义 KeyCode.h:178
@ Count
定义 KeyCode.h:184
KeyCode
键盘键码表(基于 SDL 扫描码,值为物理键位、不随键盘布局变化)
定义 KeyCode.h:14
@ Unknown
定义 KeyCode.h:15
glm::vec2 Vector2
定义 Math.h:7