aboutsummaryrefslogtreecommitdiff
path: root/src/ctrl/keyboard.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctrl/keyboard.hpp')
-rw-r--r--src/ctrl/keyboard.hpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/ctrl/keyboard.hpp b/src/ctrl/keyboard.hpp
new file mode 100644
index 0000000..c8ab983
--- /dev/null
+++ b/src/ctrl/keyboard.hpp
@@ -0,0 +1,52 @@
+#ifndef CTRL_KEYBOARD_H
+#define CTRL_KEYBOARD_H
+
+#include <cstdint>
+#include "math/vector.hpp"
+
+using engine::math::Vector2;
+
+namespace engine::controllers {
+
+enum class KeyboardKey {
+ fw,
+ bw,
+ key_left,
+ key_right,
+ zoom,
+};
+
+static constexpr std::size_t keyboard_key_count = 5;
+
+template<typename KeyDownCallback, typename KeyUpCallback>
+class Keyboard {
+ public:
+ constexpr Keyboard(KeyDownCallback key_down_cb, KeyUpCallback key_up_cb) :
+ key_down_cb{key_down_cb}, key_up_cb{key_up_cb}, key_down_list{{{}}} {}
+
+ void key_down_event(KeyboardKey key) {
+ key_down_list[static_cast<std::size_t>(key) / (sizeof(std::size_t) * 8)]
+ |= 1 << (static_cast<std::size_t>(key) % (sizeof(std::size_t) * 8));
+ key_down_cb(key);
+ }
+
+ void key_up_event(KeyboardKey key) {
+ key_down_list[static_cast<std::size_t>(key) / (sizeof(std::size_t) * 8)]
+ &= ~(1 << (static_cast<std::size_t>(key) % (sizeof(std::size_t) * 8)));
+ key_up_cb(key);
+ }
+
+ constexpr bool is_down(KeyboardKey key) const & {
+ return (key_down_list[static_cast<std::size_t>(key) / (sizeof(std::size_t) * 8)]
+ & (1 << (static_cast<std::size_t>(key) % (sizeof(std::size_t) * 8)))) != 0;
+ }
+
+ private:
+ KeyDownCallback key_down_cb;
+ KeyUpCallback key_up_cb;
+ std::array<std::size_t, (keyboard_key_count + sizeof(std::size_t) * 8 - 1) / (sizeof(std::size_t) * 8)> key_down_list;
+};
+
+}
+
+#endif // CTRL_KEYBOARD_H