diff options
Diffstat (limited to 'src/ctrl/keyboard.h')
-rw-r--r-- | src/ctrl/keyboard.h | 43 |
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; }; } |