diff options
Diffstat (limited to 'src/ctrl/keyboard.hpp')
| -rw-r--r-- | src/ctrl/keyboard.hpp | 52 |
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 |
