#ifndef CTRL_KEYBOARD_H #define CTRL_KEYBOARD_H #include #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 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(key) / (sizeof(std::size_t) * 8)] |= 1 << (static_cast(key) % (sizeof(std::size_t) * 8)); key_down_cb(key); } void key_up_event(KeyboardKey key) { key_down_list[static_cast(key) / (sizeof(std::size_t) * 8)] &= ~(1 << (static_cast(key) % (sizeof(std::size_t) * 8))); key_up_cb(key); } constexpr bool is_down(KeyboardKey key) const & { return (key_down_list[static_cast(key) / (sizeof(std::size_t) * 8)] & (1 << (static_cast(key) % (sizeof(std::size_t) * 8)))) != 0; } private: KeyDownCallback key_down_cb; KeyUpCallback key_up_cb; std::array key_down_list; }; } #endif // CTRL_KEYBOARD_H