aboutsummaryrefslogtreecommitdiff
path: root/src/ctrl/keyboard.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctrl/keyboard.h')
-rw-r--r--src/ctrl/keyboard.h43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/ctrl/keyboard.h b/src/ctrl/keyboard.h
index de7297c..4f3b4ef 100644
--- a/src/ctrl/keyboard.h
+++ b/src/ctrl/keyboard.h
@@ -1,15 +1,50 @@
#ifndef CTRL_KEYBOARD_H
#define CTRL_KEYBOARD_H
+#include <cstdint>
+#include "math/vector.h"
+
+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:
- bool fw_down, bw_down, left_down, right_down, zoom_down;
+ 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;
+ }
- constexpr Keyboard() :
- fw_down{false}, bw_down{false}, left_down{false},
- right_down{false}, zoom_down{false} {}
+ 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;
};
}