Doxygen Samurai Engine 0.0.1
Doxygen Samurai Engine Documentation
Loading...
Searching...
No Matches
input.h
Go to the documentation of this file.
1#pragma once
2#include <cstdint>
3
4#if SAMURAI_SDL
5#include <SDL.h>
6#include "backends/imgui_impl_sdl2.h"
7#endif
8
9#define INPUT_ADD_FLAG(NAME, SETNAME, VALUE) \
10 bool NAME() const {return (flags & ((std::uint32_t)1<<VALUE)); } \
11 void SETNAME(bool s) { \
12 if (s) { flags = flags | ((std::uint32_t)1 << VALUE); } \
13 else { flags = flags & ~((std::uint32_t)1 << VALUE); } \
14 }
15
16
17namespace samurai
18{
19
20
21 struct Button
22 {
23 //internal use only
24 float timer = 0;
25
26 //internal use only
27 std::uint32_t flags = 0;
28
29 //true in the first frame the key is pressed
30 INPUT_ADD_FLAG(pressed, setPressed, 0);
31
32 //true while the key is held
33 INPUT_ADD_FLAG(held, setHeld, 1);
34
35 //true in the frame the key is released
36 INPUT_ADD_FLAG(released, setReleased, 2);
37
38 //true in the first frame is pressed then after a pause true every few milliseconds
39 INPUT_ADD_FLAG(typed, setTyped, 3);
40
41 //true if the key is double pressed (true only for one frame, 3 presses would yield only one frame of this being true)
42 INPUT_ADD_FLAG(doublePressed, setDoublePressed, 4);
43
44 //last state of the button (last frame)
45 INPUT_ADD_FLAG(lastState, setLastState, 5);
46
47 enum
48 {
49 A = 0,
50 B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
56 };
57 };
58
59 struct Input
60 {
61 //typed input doesn't work with mouse buttons
64
65 //mouse position relative to window
66 int mouseX = 0;
67 int mouseY = 0;
68
70
71 char typedInput[20] = {};
72
73 //focus is here because it makes sense for the replay
74 bool hasFocus = 0;
75
76 float deltaTime = 0;
77#if SAMURAI_SDL
78 void listen();
79
80#endif
81 };
82
83#if SAMURAI_SDL
84 inline void Input::listen()
85 {
86 SDL_Event e;
87 while (SDL_PollEvent(&e))
88 {
89 ImGui_ImplSDL2_ProcessEvent(&e);
90 switch (e.type)
91 {
92 case SDL_QUIT: SDL_Quit();
93 break;
94 case SDL_KEYDOWN:
95
96 break;
97 case SDL_KEYUP:
98
99 break;
100 case SDL_MOUSEBUTTONDOWN:
101 if (e.button.button == SDL_BUTTON_LEFT)
102 {
103 lMouse.setPressed(true);
104 lMouse.setHeld(true);
105 }
106 else if (e.button.button == SDL_BUTTON_RIGHT)
107 {
108 rMouse.setPressed(true);
109 rMouse.setHeld(true);
110 }
111 break;
112 case SDL_MOUSEBUTTONUP:
113 if (e.button.button == SDL_BUTTON_LEFT)
114 {
115 lMouse.setReleased(true);
116 lMouse.setHeld(false);
117 }
118 else if (e.button.button == SDL_BUTTON_RIGHT)
119 {
120 rMouse.setReleased(true);
121 rMouse.setHeld(false);
122 }
123 break;
124 case SDL_MOUSEMOTION:
125 mouseX = e.motion.x;
126 mouseY = e.motion.y;
127 break;
128 default:
129 break;
130 }
131 }
132 }
133#endif
134
135};
136
137
138
139#undef INPUT_ADD_FLAG
INPUT_ADD_FLAG(held, setHeld, 1)
INPUT_ADD_FLAG(released, setReleased, 2)
std::uint32_t flags
Definition input.h:27
INPUT_ADD_FLAG(pressed, setPressed, 0)
INPUT_ADD_FLAG(doublePressed, setDoublePressed, 4)
INPUT_ADD_FLAG(lastState, setLastState, 5)
float timer
Definition input.h:24
INPUT_ADD_FLAG(typed, setTyped, 3)
bool hasFocus
Definition input.h:74
Button lMouse
Definition input.h:62
Button rMouse
Definition input.h:63
char typedInput[20]
Definition input.h:71
Button buttons[Button::BUTTONS_COUNT]
Definition input.h:69
float deltaTime
Definition input.h:76