aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/system')
-rw-r--r--src/crepe/system/InputSystem.cpp107
-rw-r--r--src/crepe/system/InputSystem.h23
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