aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system/InputSystem.cpp
diff options
context:
space:
mode:
authorWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-03 11:56:29 +0100
committerWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-03 11:56:29 +0100
commit7551c98ee239963ad65123132419c3c0a9cfccb3 (patch)
treecec2c548bfd4c18707fb820f91701341ea5e37b0 /src/crepe/system/InputSystem.cpp
parentd1a31a3cafc9aadb047509f5cd8b2befa212add8 (diff)
world units for click
Diffstat (limited to 'src/crepe/system/InputSystem.cpp')
-rw-r--r--src/crepe/system/InputSystem.cpp79
1 files changed, 46 insertions, 33 deletions
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index beeef87..5b220eb 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -1,16 +1,35 @@
-#include "ComponentManager.h"
-#include "api/Button.h"
-#include "api/EventManager.h"
+#include "../ComponentManager.h"
+#include "../api/Button.h"
+#include "../api/EventManager.h"
#include "InputSystem.h"
using namespace crepe;
+
void InputSystem::update() {
+ ComponentManager & mgr = this->component_manager;
EventManager & event_mgr = EventManager::get_instance();
std::vector<SDLContext::EventData> event_list = SDLContext::get_instance().get_events();
+ RefVector<Button> buttons = mgr.get_components_by_type<Button>();
+ RefVector<Camera> cameras = mgr.get_components_by_type<Camera>();
+ // Find the active camera
+ for (Camera & cam : cameras) {
+ if (!cam.active) continue;
+ this->curr_cam_ref = cam;
+ break;
+ }
+ if (!curr_cam_ref) return;
+ Camera& current_cam = curr_cam_ref;
+ RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(current_cam.game_object_id);
+ Transform& cam_transform = transform_vec.front().get();
+ int camera_origin_x = cam_transform.position.x + current_cam.offset.x - (current_cam.viewport_size.x / 2);
+ int camera_origin_y = cam_transform.position.y + current_cam.offset.y - (current_cam.viewport_size.y / 2);
for (const SDLContext::EventData & event : event_list) {
+ int world_mouse_x = event.mouse_position.first + camera_origin_x;
+ int world_mouse_y = event.mouse_position.second + camera_origin_y;
+
switch (event.event_type) {
case SDLContext::EventType::KEYDOWN:
event_mgr.queue_event<KeyPressEvent>(KeyPressEvent{
@@ -25,43 +44,43 @@ void InputSystem::update() {
break;
case SDLContext::EventType::MOUSEDOWN:
event_mgr.queue_event<MousePressEvent>(MousePressEvent{
- .mouse_x = event.mouse_position.first,
- .mouse_y = event.mouse_position.second,
+ .mouse_x = world_mouse_x,
+ .mouse_y = world_mouse_y,
.button = event.mouse_button,
});
- last_mouse_down_position = event.mouse_position;
+ last_mouse_down_position = {world_mouse_x, world_mouse_y};
last_mouse_button = event.mouse_button;
break;
case SDLContext::EventType::MOUSEUP: {
event_mgr.queue_event<MouseReleaseEvent>(MouseReleaseEvent{
- .mouse_x = event.mouse_position.first,
- .mouse_y = event.mouse_position.second,
+ .mouse_x = world_mouse_x,
+ .mouse_y = world_mouse_y,
.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;
+ //check if its a click by checking the last button down
+ int delta_x = world_mouse_x - last_mouse_down_position.first;
+ int delta_y = world_mouse_y - 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>(MouseClickEvent{
- .mouse_x = event.mouse_position.first,
- .mouse_y = event.mouse_position.second,
+ .mouse_x = world_mouse_x,
+ .mouse_y = world_mouse_y,
.button = event.mouse_button,
});
- handle_click(event);
+ handle_click(event.mouse_button, world_mouse_x, world_mouse_y);
}
} break;
case SDLContext::EventType::MOUSEMOVE:
event_mgr.queue_event<MouseMoveEvent>(MouseMoveEvent{
- .mouse_x = event.mouse_position.first,
- .mouse_y = event.mouse_position.second,
+ .mouse_x = world_mouse_x,
+ .mouse_y = world_mouse_y,
.rel_x = event.rel_mouse_move.first,
.rel_y = event.rel_mouse_move.second,
});
- handle_move(event);
+ handle_move(event, world_mouse_x, world_mouse_y);
break;
case SDLContext::EventType::MOUSEWHEEL:
event_mgr.queue_event<MouseScrollEvent>(MouseScrollEvent{
@@ -79,7 +98,7 @@ void InputSystem::update() {
}
}
-void InputSystem::handle_move(const SDLContext::EventData & event_data) {
+void InputSystem::handle_move(const SDLContext::EventData & event_data, const int& world_mouse_x, const int& world_mouse_y) {
ComponentManager & mgr = this->component_manager;
RefVector<Button> buttons = mgr.get_components_by_type<Button>();
@@ -90,19 +109,14 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data) {
OptionalRef<Transform> transform(transform_vec.front().get());
if (!transform) continue;
- bool was_hovering = button.hover; // Store previous hover state
-
- // Check if the mouse is inside the button
- if (button.active && is_mouse_inside_button(event_data, button, transform)) {
+ bool was_hovering = button.hover;
+ if (button.active && is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) {
button.hover = true;
-
- // Trigger the on_enter callback if the hover state just changed to true
if (!was_hovering && button.on_enter) {
button.on_enter();
}
} else {
button.hover = false;
-
// Trigger the on_exit callback if the hover state just changed to false
if (was_hovering && button.on_exit) {
button.on_exit();
@@ -111,7 +125,7 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data) {
}
}
-void InputSystem::handle_click(const SDLContext::EventData & event_data) {
+void InputSystem::handle_click(const MouseButton& mouse_button, const int& world_mouse_x, const int& world_mouse_y) {
ComponentManager & mgr = this->component_manager;
RefVector<Button> buttons = mgr.get_components_by_type<Button>();
@@ -121,18 +135,17 @@ void InputSystem::handle_click(const SDLContext::EventData & event_data) {
= mgr.get_components_by_id<Transform>(button.game_object_id);
OptionalRef<Transform> transform(transform_vec.front().get());
- if (button.active && is_mouse_inside_button(event_data, button, transform)) {
+ if (button.active && is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) {
handle_button_press(button);
}
}
}
-bool InputSystem::is_mouse_inside_button(const SDLContext::EventData & event_data,
- const Button & button, const Transform & transform) {
- return event_data.mouse_position.first >= transform.position.x
- && event_data.mouse_position.first <= transform.position.x + button.width
- && event_data.mouse_position.second >= transform.position.y
- && event_data.mouse_position.second <= transform.position.y + button.height;
+bool InputSystem::is_mouse_inside_button(const int& mouse_x, const int& mouse_y, const Button & button, const Transform & transform) {
+ return mouse_x >= transform.position.x
+ && mouse_x <= transform.position.x + button.width
+ && mouse_y >= transform.position.y
+ && mouse_y <= transform.position.y + button.height;
}
void InputSystem::handle_button_press(Button & button) {