aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/system')
-rw-r--r--src/crepe/system/InputSystem.cpp87
-rw-r--r--src/crepe/system/InputSystem.h7
2 files changed, 77 insertions, 17 deletions
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index b7a86f4..c61a80f 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -2,26 +2,86 @@
#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;
-InputSystem::InputSystem(ComponentManager &component_manager)
- : System(component_manager) {
- auto &event_manager = EventManager::get_instance();
- event_manager.subscribe<MouseClickEvent>([this](const MouseClickEvent &event) {
- return this->handle_click(event);
- });
-
- event_manager.subscribe<MouseMoveEvent>([this](const MouseMoveEvent &event) {
- return this->handle_move(event);
- });
-}
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) {
@@ -45,8 +105,3 @@ bool InputSystem::handle_click(const MouseClickEvent &event) {
return false;
}
-bool InputSystem::handle_move(const MouseMoveEvent &event) {
-
- ComponentManager &mgr = this->component_manager;
-
-}
diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h
index c50d928..231aa45 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -7,8 +7,13 @@ namespace crepe {
class InputSystem : public System {
public:
using System::System;
- InputSystem(ComponentManager & component_manager);
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);