dl
dl_input.h
浏览该文件的文档.
1
10#pragma once
11
12#include <string>
13
14#include "dl_type.h"
15#include "base/dl_array_enum.h"
16#include "math/dl_math.h"
17
18#undef DELETE
19
20namespace dl
21{
22 //todo 手柄尚未处理
24constexpr size_t NUM_MAX_GAME_PAD = 4;
25
26enum class PadCode
27{
28 UP = 0x0001,
29 DOWN = 0x0002,
30 LEFT = 0x0004,
31 RIGHT = 0x0008,
32 START = 0x0010,
33 BACK = 0x0020,
34 LS = 0x0040,
35 RS = 0x0080,
36 LB = 0x0100,
37 RB = 0x0200,
38 A = 0x1000,
39 B = 0x2000,
40 X = 0x4000,
41 Y = 0x8000
42};
43
45{
46 friend class InputImp;
47public:
48 bool KeyUp(PadCode pad);
49 bool KeyDown(PadCode pad);
50 bool KeyState(PadCode pad);
51
52 float ForceLT();
53 float ForceRT();
54
57
58 float ForceLS();
59 float ForceRS();
60 //设置振动
62private:
63 std::size_t _id;
64};
65
66//按键定义,与glfw一致
67enum class MouseCode
68{
69 UNKNOWN = -1,
70 LEFT = 0,
71 RIGHT = 1,
72 MIDDLE = 2,
73 KEY4 = 3,
74 KEY5 = 4,
75 KEY6 = 5,
76 KEY7 = 6,
77 LAST = 7,
79};
80
81enum class KeyCode : int
82{
83 UNKNOWN = -1,
84 SPACE = 32,
85 APOSTROPHE = 39, // '
86 COMMA = 44, // ,
87 MINUS = 45, // -
88 PERIOD = 46, // .
89 SLASH = 47, // /
90 KEY0 = 48,
91 KEY1 = 49,
92 KEY2 = 50,
93 KEY3 = 51,
94 KEY4 = 52,
95 KEY5 = 53,
96 KEY6 = 54,
97 KEY7 = 55,
98 KEY8 = 56,
99 KEY9 = 57,
100 SEMICOLON = 59, // ;
101 EQUAL = 61, // =
102 A = 65,
103 B = 66,
104 C = 67,
105 D = 68,
106 E = 69,
107 F = 70,
108 G = 71,
109 H = 72,
110 I = 73,
111 J = 74,
112 K = 75,
113 L = 76,
114 M = 77,
115 N = 78,
116 O = 79,
117 P = 80,
118 Q = 81,
119 R = 82,
120 S = 83,
121 T = 84,
122 U = 85,
123 V = 86,
124 W = 87,
125 X = 88,
126 Y = 89,
127 Z = 90,
128 LEFT_BRACKET = 91, // [
129 BACKSLASH = 92, // 左斜杠
130 RIGHT_BRACKET = 93, // ]
131 GRAVE_ACCENT = 96, // `
132 WORLD_1 = 161,
133 WORLD_2 = 162,
134 ESCAPE = 256,
135 ENTER = 257,
136 TAB = 258,
138 INSERT = 260,
139 DELETE = 261,
140 RIGHT = 262,
141 LEFT = 263,
142 DOWN = 264,
143 UP = 265,
144 PAGE_UP = 266,
146 HOME = 268,
147 END = 269,
150 NUM_LOCK = 282,
152 PAUSE = 284,
153 F1 = 290,
154 F2 = 291,
155 F3 = 292,
156 F4 = 293,
157 F5 = 294,
158 F6 = 295,
159 F7 = 296,
160 F8 = 297,
161 F9 = 298,
162 F10 = 299,
163 F11 = 300,
164 F12 = 301,
165 F13 = 302,
166 F14 = 303,
167 F15 = 304,
168 F16 = 305,
169 F17 = 306,
170 F18 = 307,
171 F19 = 308,
172 F20 = 309,
173 F21 = 310,
174 F22 = 311,
175 F23 = 312,
176 F24 = 313,
177 F25 = 314,
178 KP_0 = 320,
179 KP_1 = 321,
180 KP_2 = 322,
181 KP_3 = 323,
182 KP_4 = 324,
183 KP_5 = 325,
184 KP_6 = 326,
185 KP_7 = 327,
186 KP_8 = 328,
187 KP_9 = 329,
192 KP_ADD = 334,
193 KP_ENTER = 335,
194 KP_EQUAL = 336,
197 LEFT_ALT = 342,
203 MENU = 348,
206};
207
208class InputImp;
209class Coor;
211class Input
212{
213 friend class System;
214public:
215 enum class KeyNameType
216 {
219 };
220
222 _cursorPosClickPre{},
223 _tClickPre{ 0 },
224 _tMaxClickDouble{ 1000 },
225 _disMaxClickDouble{ 10 },
226 _bClickDouble{ false }
227 {
228 for (auto& iter : _keyPre)
229 {
230 iter = false;
231 }
232 for (auto& iter : _key)
233 {
234 iter = false;
235 }
236 for (auto& iter : _keyMouse)
237 {
238 iter = false;
239 }
240 for (auto& iter : _keyMousePre)
241 {
242 iter = false;
243 }
244 }
246
250 bool KeyUp(KeyCode key_code)
251 {
252 return !_key[key_code] && _keyPre[key_code];
253 }
254
257 bool KeyDown(KeyCode key_code)
258 {
259 return _key[key_code] && !_keyPre[key_code];
260 }
261
269 bool KeyState(KeyCode key_code)
270 {
271 return _key[key_code];
272 }
273
278 std::string GetKeyName(KeyCode key_code);
279
283 bool KeyUp(MouseCode mouse_code)
284 {
285 return !_keyMouse[mouse_code] && _keyMousePre[mouse_code];
286 }
287
290 bool KeyDown(MouseCode mouse_code)
291 {
292 return _keyMouse[mouse_code] && !_keyMousePre[mouse_code];
293 }
294
297 bool KeyState(MouseCode mouse_code)
298 {
299 return _keyMouse[mouse_code];
300 }
301
305 {
306 return _bClickDouble;
307 }
308
313
322
327 {
328 return _cursorPos;
329 }
330
335 {
336 return _cursorPos - _cursorPosPre;
337 }
338
343 {
344 return _scrollDelta;
345 }
347 {
348 _scrollDelta = {};
349 }
350
353 void SetRunBackground(bool run = false);
361 bool WaitKeyDown(KeyCode& key_code, bool contain_special = false);
362
367 void SetGamePadOpen(bool open);
372 GamePad* GetGamePad(unsigned id);
373
374
378 void ControlCoor(Coor* coor,
379 Float move_speed = 200_f,
380 Float scale_speed = 1_f,
381 Float rotate_speed = Math::PI(1, 2));
382
387 void _set_key(int key, bool down)
388 {
389 _key[(KeyCode)key] = down;
390 }
391
395 void _set_key_mouse(int key, bool down)
396 {
397 _keyMouse[(MouseCode)key] = down;
398 }
399
403 void _set_cursor(int xpos, int ypos, bool b_clear_cursor_dt);
408 void _set_scroll(double dx, double dy)
409 {
410 _scrollDelta = toPosition(dx, dy);
411 }
412
413private:
414 //轮询事件之前调用,覆盖pre状态
415 void _update()
416 {
417 for (int i = 0; i != int(KeyCode::MAX_NUM); ++i)
418 {
419 _keyPre[(KeyCode)i] = _key[(KeyCode)i];
420 }
421 for (int i = 0; i != int(MouseCode::MAX_NUM); ++i)
422 {
423 _keyMousePre[(MouseCode)i] = _keyMouse[(MouseCode)i];
424 }
425 _clear_cursor_dt();
426 _scrollDelta = {};
427 }
428 void _update_late();
429 //覆盖光标旧值
430 void _clear_cursor_dt()
431 {
432 _cursorPosPre = _cursorPos;
433 }
434
435 InputImp* _imp;
436
437 // 键盘消息
438 ArrayEnum<bool, KeyCode::MAX_NUM> _key;
439 // 上一帧的状态
440 ArrayEnum<bool, KeyCode::MAX_NUM> _keyPre;
441 // 按键名字
442 ArrayEnum<std::string, KeyCode::MAX_NUM> _keyName;
443
444 // 键盘消息
445 ArrayEnum<bool, MouseCode::MAX_NUM> _keyMouse;
446 // 上一帧的状态
447 ArrayEnum<bool, MouseCode::MAX_NUM> _keyMousePre;
448
449 Point _cursorPosPre;
450 Point _cursorPos;
451
452 // 鼠标左键双击相关
453 Point _cursorPosClickPre;
454 time_t _tClickPre;
455 time_t _tMaxClickDouble;
456 int _disMaxClickDouble;
457 bool _bClickDouble;
458
459
460
461 bool _bNoWriteLast;
462
463 Position _scrollDelta;
464 bool _runBackground;
465 bool _runOutWindow;
466
467};
468
469extern Input* g_input;
470
471}
2d坐标系
float ForceRS()
friend class InputImp
bool KeyState(PadCode pad)
void SetVibration(Position lr)
bool KeyUp(PadCode pad)
float ForceRT()
float ForceLS()
bool KeyDown(PadCode pad)
Position GetLS()
float ForceLT()
Position GetRS()
键盘、鼠标、手柄等输入检测
bool KeyUp(KeyCode key_code)
检测一个按键按下并释放,只1帧有效。
void _set_key(int key, bool down)
设置一个键是否按下
void SetMousePositionCenter()
设置鼠标居中窗口中。
bool WaitKeyDown(KeyCode &key_code, bool contain_special=false)
直到一个按键被按下 返回真。
bool KeyUp(MouseCode mouse_code)
鼠标键按下并释放,只1帧有效。
void SetRunBackground(bool run=false)
设置是否允许后台检测按键。
bool KeyDown(MouseCode mouse_code)
鼠标键按下,只1帧有效。
Position2 GetCursorPos()
void _set_scroll(double dx, double dy)
设置滚轮
Point GetCursorPositionDelta()
和上帧的鼠标位置变化。
void ControlCoor(Coor *coor, Float move_speed=200_f, Float scale_speed=1_f, Float rotate_speed=Math::PI(1, 2))
控制一个Coor移动、缩放、旋转
Point GetCursorPositionOutWindow()
返回鼠标位置,会超出窗口外,特殊情况使用。
void SetGamePadOpen(bool open)
设置手柄是否启用。
void ClearScrollDelta()
void _set_cursor(int xpos, int ypos, bool b_clear_cursor_dt)
设置光标位置
bool ClickDouble()
鼠标左键双击
bool KeyDown(KeyCode key_code)
检测一个按键按下了,松开后再按下才会再次触发,只1帧有效。
Position GetScrollDelta()
获取滚动变化
bool KeyDownAny()
检测是否按下任意键。
bool KeyState(KeyCode key_code)
检测一个按键是否按下。
bool KeyState(MouseCode mouse_code)
鼠标键状态
void SetKeyNameType(KeyNameType type)
设置按键名字。
std::string GetKeyName(KeyCode key_code)
返回按键的名称。
void _set_key_mouse(int key, bool down)
设置鼠标键是否按下
Point GetCursorPosition()
返回鼠标位置。限制到窗口范围
friend class System
GamePad * GetGamePad(unsigned id)
返回手柄对象,失败返回nullptr。 @parma[in] id 手柄编号0-3
array使用枚举类作为索引的封装
数学相关的通用算法
通用类型
constexpr double PI(unsigned n=1, unsigned d=1)
返回PI的分数
Position2 Position
constexpr Array< Position::value_type, N > toPosition(const Array< T, N > &a)
转换到Position,已知长度
Input * g_input
float Float
Array< Float, 2 > Position2
constexpr size_t NUM_MAX_GAME_PAD
手柄数量上限
Point2 Point