ShitEngine
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
Toggle main menu visibility
载入中...
搜索中...
未找到
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
12
union
SDL_Event;
13
14
namespace
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
// --- 底层:鼠标 ---
47
bool
isMouseButtonDown
(
MouseButton
code)
const
;
48
bool
isMouseButtonPressed
(
MouseButton
code)
const
;
49
bool
isMouseButtonReleased
(
MouseButton
code)
const
;
50
Vector2
getMousePosition
()
const
;
51
Vector2
getMouseScroll
()
const
;
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;
94
KeyCode
key =
KeyCode::Unknown
;
95
MouseButton
mouse =
MouseButton::Count
;
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
}
Core.h
SHIT_API
#define SHIT_API
定义
Core.h:14
KeyCode.h
Math.h
Shit::Input::IsMouseButtonDown
static bool IsMouseButtonDown(MouseButton code)
定义
Input.h:73
Shit::Input::IsKeyPressed
static bool IsKeyPressed(KeyCode code)
定义
Input.h:70
Shit::Input::isKeyDown
bool isKeyDown(KeyCode code) const
Shit::Input::initMappings
void initMappings()
从 Config 预编译动作/轴绑定(ConfigInit 之后调用)
Shit::Input::isActionPressed
bool isActionPressed(const std::string &action) const
Shit::Input::IsKeyReleased
static bool IsKeyReleased(KeyCode code)
定义
Input.h:71
Shit::Input::GetInstance
static Input & GetInstance()
Shit::Input::IsActionReleased
static bool IsActionReleased(const std::string &action)
定义
Input.h:81
Shit::Input::getMouseScroll
Vector2 getMouseScroll() const
Shit::Input::Update
static void Update()
定义
Input.h:85
Shit::Input::isMouseButtonPressed
bool isMouseButtonPressed(MouseButton code) const
Shit::Input::IsKeyDown
static bool IsKeyDown(KeyCode code)
定义
Input.h:69
Shit::Input::InitMappings
static void InitMappings()
定义
Input.h:84
Shit::Input::isKeyReleased
bool isKeyReleased(KeyCode code) const
Shit::Input::isKeyPressed
bool isKeyPressed(KeyCode code) const
Shit::Input::isActionReleased
bool isActionReleased(const std::string &action) const
Shit::Input::getAxis
float getAxis(const std::string &axis) const
Shit::Input::isMouseButtonDown
bool isMouseButtonDown(MouseButton code) const
Shit::Input::IsActionDown
static bool IsActionDown(const std::string &action)
定义
Input.h:79
Shit::Input::getMousePosition
Vector2 getMousePosition() const
Shit::Input::GetMousePosition
static Vector2 GetMousePosition()
定义
Input.h:76
Shit::Input::handleEvent
void handleEvent(const SDL_Event &event)
Shit::Input::update
void update()
帧末:current → previous
Shit::Input::IsActionPressed
static bool IsActionPressed(const std::string &action)
定义
Input.h:80
Shit::Input::isMouseButtonReleased
bool isMouseButtonReleased(MouseButton code) const
Shit::Input::EngineContext
friend class EngineContext
定义
Input.h:89
Shit::Input::IsMouseButtonPressed
static bool IsMouseButtonPressed(MouseButton code)
定义
Input.h:74
Shit::Input::IsMouseButtonReleased
static bool IsMouseButtonReleased(MouseButton code)
定义
Input.h:75
Shit::Input::GetAxis
static float GetAxis(const std::string &axis)
定义
Input.h:82
Shit::Input::HandleEvent
static void HandleEvent(const SDL_Event &event)
定义
Input.h:86
Shit::Input::isActionDown
bool isActionDown(const std::string &action) const
Shit::Input::GetMouseScroll
static Vector2 GetMouseScroll()
定义
Input.h:77
Shit
定义
AudioPlayer.h:10
Shit::MouseButton
MouseButton
定义
KeyCode.h:170
Shit::MouseButton::Count
@ Count
定义
KeyCode.h:176
Shit::KeyCode
KeyCode
定义
KeyCode.h:8
Shit::KeyCode::Unknown
@ Unknown
定义
KeyCode.h:9
Shit::Vector2
glm::vec2 Vector2
定义
Math.h:5
include
ShitEngine
Input
Input.h
制作者
1.17.0