diff options
Diffstat (limited to 'src/crepe/system')
-rw-r--r-- | src/crepe/system/InputSystem.cpp | 107 | ||||
-rw-r--r-- | src/crepe/system/InputSystem.h | 23 |
2 files changed, 130 insertions, 0 deletions
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp new file mode 100644 index 0000000..c61a80f --- /dev/null +++ b/src/crepe/system/InputSystem.cpp @@ -0,0 +1,107 @@ +#include "ComponentManager.h" +#include "../api/Button.h" +#include "../api/EventManager.h" +#include "../api/Transform.h" +#include "../facade/SDLContext.h" +#include "../api/Event.h" + +#include "system/InputSystem.h" + +using namespace crepe; + + + +void InputSystem::update() { + EventManager& event_mgr = EventManager::get_instance(); + std::vector<SDLContext::EventData> event_list = SDLContext::get_instance().get_events(); + + for (SDLContext::EventData event : event_list) { + switch (event.event_type) { + case SDLContext::Event::KEYDOWN: { + event_mgr.queue_event(KeyPressEvent{ + .key = event.key, + .repeat = event.key_repeat, + }); + break; + } + case SDLContext::Event::KEYUP: { + event_mgr.queue_event(KeyReleaseEvent{ + .key = event.key, + }); + break; + } + case SDLContext::Event::MOUSEDOWN: { + event_mgr.queue_event(MousePressEvent{ + .mouse_x = event.mouse_position.first, + .mouse_y = event.mouse_position.second, + .button = event.mouse_button, + }); + break; + } + case SDLContext::Event::MOUSEMOVE: { + event_mgr.queue_event(MouseMoveEvent{ + .mouse_x = event.mouse_position.first, + .mouse_y = event.mouse_position.second, + .rel_x = event.rel_mouse_move.first, + .rel_y = event.rel_mouse_move.second, + }); + break; + } + case SDLContext::Event::MOUSEUP: { + event_mgr.queue_event(MouseReleaseEvent{ + .mouse_x = event.mouse_position.first, + .mouse_y = event.mouse_position.second, + .button = event.mouse_button, + }); + int delta_x = event.mouse_position.first - last_mouse_down_position.first; + int delta_y = event.mouse_position.second - last_mouse_down_position.second; + if (last_mouse_button == event.mouse_button && + std::abs(delta_x) <= click_tolerance && + std::abs(delta_y) <= click_tolerance) { + event_mgr.queue_event(MouseClickEvent{ + .mouse_x = event.mouse_position.first, + .mouse_y = event.mouse_position.second, + .button = event.mouse_button, + }); + } + break; + } + case SDLContext::Event::MOUSEWHEEL: { + event_mgr.queue_event(MouseScrollEvent{ + .scroll_x = event.mouse_position.first, + .scroll_y = event.mouse_position.second, + .direction = event.wheel_delta, + }); + break; + } + case SDLContext::Event::SHUTDOWN: { + event_mgr.queue_event(ShutDownEvent{}); + break; + } + default: + break; + } + } +} + +bool InputSystem::handle_click(const MouseClickEvent &event) { + ComponentManager &mgr = this->component_manager; + + std::vector<std::reference_wrapper<Button>> buttons = + mgr.get_components_by_type<Button>(); + + std::vector<std::reference_wrapper<Transform>> transforms = + mgr.get_components_by_type<Transform>(); + for (Button &button : buttons) { + for(Transform& transform : transforms){ + if(button.game_object_id != transform.game_object_id){continue;} + if (!button.interactable) {break;} + if (event.mouse_x >= transform.position.x && event.mouse_x <= transform.position.x + button.width && + event.mouse_y >= transform.position.y && event.mouse_y <= transform.position.y + button.height) { + button.on_click(); + } + } + } + return false; +} + diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h new file mode 100644 index 0000000..231aa45 --- /dev/null +++ b/src/crepe/system/InputSystem.h @@ -0,0 +1,23 @@ +#pragma once + +#include "System.h" +#include "../api/Event.h" +namespace crepe { + +class InputSystem : public System { +public: + using System::System; + void update() override; + void process_events(); + +private: + std::pair<int, int> last_mouse_down_position{-1, -1}; + MouseButton last_mouse_button = MouseButton::NONE; + const int click_tolerance = 5; + bool handle_click(const MouseClickEvent &event); + bool handle_move(const MouseMoveEvent &event); + bool handle_key_press(const KeyPressEvent &event); + bool handle_key_release(const KeyReleaseEvent &event); +}; + +} // namespace crepe |