ShitEngine
基于 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);
65
66 // --- 静态门面 ---
67 static Input& GetInstance();
68
69 static bool IsKeyDown(KeyCode code) { return GetInstance().isKeyDown(code); }
70 static bool IsKeyPressed(KeyCode code) { return GetInstance().isKeyPressed(code); }
71 static bool IsKeyReleased(KeyCode code) { return GetInstance().isKeyReleased(code); }
72
73 static bool IsMouseButtonDown(MouseButton code) { return GetInstance().isMouseButtonDown(code); }
74 static bool IsMouseButtonPressed(MouseButton code) { return GetInstance().isMouseButtonPressed(code); }
75 static bool IsMouseButtonReleased(MouseButton code) { return GetInstance().isMouseButtonReleased(code); }
76 static Vector2 GetMousePosition() { return GetInstance().getMousePosition(); }
77 static Vector2 GetMouseScroll() { return GetInstance().getMouseScroll(); }
78
79 static bool IsActionDown(const std::string& action) { return GetInstance().isActionDown(action); }
80 static bool IsActionPressed(const std::string& action) { return GetInstance().isActionPressed(action); }
81 static bool IsActionReleased(const std::string& action) { return GetInstance().isActionReleased(action); }
82 static float GetAxis(const std::string& axis) { return GetInstance().getAxis(axis); }
83
84 static void InitMappings() { GetInstance().initMappings(); }
85 static void Update() { GetInstance().update(); }
86 static void HandleEvent(const SDL_Event& event) { GetInstance().handleEvent(event); }
87
88 private:
89 friend class EngineContext;
90 enum class BindingType { Key, Mouse };
91
92 struct CompiledBinding {
93 BindingType type = BindingType::Key;
96 };
97
98 struct CompiledAction {
99 std::vector<CompiledBinding> bindings;
100 };
101
102 struct CompiledAxis {
103 std::vector<CompiledBinding> negative;
104 std::vector<CompiledBinding> positive;
105 };
106
107 Input();
108 ~Input();
109
110 Input(const Input&) = delete;
111 Input& operator=(const Input&) = delete;
112 Input(Input&&) = delete;
113 Input& operator=(Input&&) = delete;
114
115 // 解析配置键名 → 编译后绑定;失败返回 false 并打 WARN
116 bool compileBinding(const std::string& name, CompiledBinding& out) const;
117 static KeyCode parseKeyCode(const std::string& name);
118 static MouseButton parseMouseButton(const std::string& name);
119 static std::string normalizeKeyName(const std::string& name);
120
121 bool isBindingDown(const CompiledBinding& b) const;
122 bool isBindingPressed(const CompiledBinding& b) const;
123 bool isBindingReleased(const CompiledBinding& b) const;
124
125 bool anyBindingDown(const std::vector<CompiledBinding>& bindings) const;
126 bool anyBindingPressed(const std::vector<CompiledBinding>& bindings) const;
127 bool anyBindingReleased(const std::vector<CompiledBinding>& bindings) const;
128
129 // 底层状态
130 std::array<bool, static_cast<int>(KeyCode::Count)> m_currentKeys{};
131 std::array<bool, static_cast<int>(KeyCode::Count)> m_previousKeys{};
132 std::array<bool, static_cast<int>(MouseButton::Count)> m_currentMouseButtons{};
133 std::array<bool, static_cast<int>(MouseButton::Count)> m_previousMouseButtons{};
134 Vector2 m_mouseScroll{ 0.0f, 0.0f };
135
136 // 预编译映射
137 std::unordered_map<std::string, CompiledAction> m_actions;
138 std::unordered_map<std::string, CompiledAxis> m_axes;
139 bool m_mappingsReady = false;
140 };
141}
#define SHIT_API
定义 Core.h:14
static bool IsMouseButtonDown(MouseButton code)
定义 Input.h:73
static bool IsKeyPressed(KeyCode code)
定义 Input.h:70
bool isKeyDown(KeyCode code) const
void initMappings()
从 Config 预编译动作/轴绑定(ConfigInit 之后调用)
bool isActionPressed(const std::string &action) const
static bool IsKeyReleased(KeyCode code)
定义 Input.h:71
static Input & GetInstance()
static bool IsActionReleased(const std::string &action)
定义 Input.h:81
Vector2 getMouseScroll() const
static void Update()
定义 Input.h:85
bool isMouseButtonPressed(MouseButton code) const
static bool IsKeyDown(KeyCode code)
定义 Input.h:69
static void InitMappings()
定义 Input.h:84
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:79
Vector2 getMousePosition() const
static Vector2 GetMousePosition()
定义 Input.h:76
void handleEvent(const SDL_Event &event)
void update()
帧末:current → previous
static bool IsActionPressed(const std::string &action)
定义 Input.h:80
bool isMouseButtonReleased(MouseButton code) const
friend class EngineContext
定义 Input.h:89
static bool IsMouseButtonPressed(MouseButton code)
定义 Input.h:74
static bool IsMouseButtonReleased(MouseButton code)
定义 Input.h:75
static float GetAxis(const std::string &axis)
定义 Input.h:82
static void HandleEvent(const SDL_Event &event)
定义 Input.h:86
bool isActionDown(const std::string &action) const
static Vector2 GetMouseScroll()
定义 Input.h:77
定义 AudioPlayer.h:10
MouseButton
定义 KeyCode.h:170
@ Count
定义 KeyCode.h:176
KeyCode
定义 KeyCode.h:8
@ Unknown
定义 KeyCode.h:9
glm::vec2 Vector2
定义 Math.h:5