aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
authorWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-17 20:12:30 +0100
committerWBoerenkamps <wrj.boerenkamps@student.avans.nl>2024-12-17 20:12:30 +0100
commiteb9c76082d7d0ee0c3e55cb8eadfa5f8978bd8f2 (patch)
tree97b0a6c7ae7e0feaba856a1e3e3836fa91a4dc0b /src/crepe
parentb421eec1073c1fb4b99d46cc36c5c9cbd8d3c4a7 (diff)
button improvements
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/api/Button.cpp6
-rw-r--r--src/crepe/api/Button.h50
-rw-r--r--src/crepe/api/Event.h3
-rw-r--r--src/crepe/system/InputSystem.cpp26
-rw-r--r--src/crepe/system/InputSystem.h22
5 files changed, 51 insertions, 56 deletions
diff --git a/src/crepe/api/Button.cpp b/src/crepe/api/Button.cpp
index 305922c..40153c9 100644
--- a/src/crepe/api/Button.cpp
+++ b/src/crepe/api/Button.cpp
@@ -2,9 +2,7 @@
namespace crepe {
-Button::Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset,
- const std::function<void()> & on_click)
- : UIObject(id, dimensions, offset),
- on_click(on_click) {}
+Button::Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset)
+ : UIObject(id, dimensions, offset) {}
} // namespace crepe
diff --git a/src/crepe/api/Button.h b/src/crepe/api/Button.h
index e97f884..5d4156b 100644
--- a/src/crepe/api/Button.h
+++ b/src/crepe/api/Button.h
@@ -5,18 +5,21 @@
#include "UIObject.h"
#include "Event.h"
#include "Metadata.h"
+
namespace crepe {
/**
- * \brief Event triggered when a button is pressed
+ * \brief Button component.
+ *
+ * This component creates a clickable surface at the transform location with the specified width and height.
+ *
+ * The Button can be used in scripts by subscribing a EventHandler to the following events:
+ * - **ButtonPressEvent**: Triggered when the surface is clicked with the mouse. Contains GameObject metadata.
+ * - **MouseEnterEvent**: Triggered when the mouse enters the button area. Contains GameObject metadata.
+ * - **MouseExitEvent**: Triggered when the mouse leaves the button area. Contains GameObject metadata.
+ * \see EventManager
*
*/
-class ButtonPressEvent : public Event{
- public:
-
-
-}
-//! Represents a clickable UI button, derived from the UiObject class.
class Button : public UIObject {
public:
/**
@@ -25,43 +28,14 @@ public:
* \param id The unique ID of the game object associated with this button.
* \param dimensions The width and height of the UIObject
* \param offset The offset relative this GameObjects Transform
- * \param on_click callback function that will be invoked when the button is clicked.
*/
- Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset,
- const std::function<void()> & on_click);
-
- // TODO: create separate toggle button class
- /**
- * \brief The callback function to be executed when the button is clicked.
- *
- * This function is invoked whenever the button is clicked. It can be set to any
- * function that matches the signature `void()`.
- */
- std::function<void()> on_click = nullptr;
-
- /**
- * \brief Callback function to be executed when the mouse enters the button's boundaries.
- *
- * This function is triggered when the mouse cursor moves over the button, allowing
- * custom actions like visual effects, highlighting, or sound effects.
- */
- std::function<void()> on_mouse_enter = nullptr;
-
- /**
- * \brief Callback function to be executed when the mouse exits the button's boundaries.
- *
- * This function is triggered when the mouse cursor moves out of the button's area,
- * allowing custom actions like resetting visual effects or playing exit-related effects.
- */
- std::function<void()> on_mouse_exit = nullptr;
+ Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset);
private:
- //! friend relation for is_pressed and hover variables
+ //! friend relation hover variable
friend class InputSystem;
//! Indicates whether the mouse is currently hovering over the button
bool hover = false;
-
-public:
};
} // namespace crepe
diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h
index b0dd931..a03bb54 100644
--- a/src/crepe/api/Event.h
+++ b/src/crepe/api/Event.h
@@ -3,9 +3,10 @@
#include <string>
-#include "api/KeyCodes.h"
#include "types.h"
+#include "api/KeyCodes.h"
+
namespace crepe {
/**
diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp
index fca540f..5d1537d 100644
--- a/src/crepe/system/InputSystem.cpp
+++ b/src/crepe/system/InputSystem.cpp
@@ -155,28 +155,27 @@ void InputSystem::handle_non_mouse_event(const EventData & event) {
void InputSystem::handle_move(const EventData & event_data, const vec2 & mouse_pos) {
ComponentManager & mgr = this->mediator.component_manager;
-
+ EventManager& event_mgr = this->mediator.event_manager;
RefVector<Button> buttons = mgr.get_components_by_type<Button>();
for (Button & button : buttons) {
if (!button.active) continue;
RefVector<Transform> transform_vec
= mgr.get_components_by_id<Transform>(button.game_object_id);
- Transform & transform(transform_vec.front().get());
-
+ Transform & transform = transform_vec.front().get();
+ RefVector<Metadata> metadata_vec
+ = mgr.get_components_by_id<Metadata>(button.game_object_id);
+ Metadata & metadata = metadata_vec.front().get();
bool was_hovering = button.hover;
if (this->is_mouse_inside_button(mouse_pos, button, transform)) {
button.hover = true;
- if (!button.on_mouse_enter) continue;
if (!was_hovering) {
- button.on_mouse_enter();
+ event_mgr.trigger_event<ButtonEnterEvent>(metadata);
}
} else {
button.hover = false;
- // Trigger the on_exit callback if the hover state just changed to false
- if (!button.on_mouse_exit) continue;
if (was_hovering) {
- button.on_mouse_exit();
+ event_mgr.trigger_event<ButtonExitEvent>(metadata);
}
}
}
@@ -184,19 +183,20 @@ void InputSystem::handle_move(const EventData & event_data, const vec2 & mouse_p
void InputSystem::handle_click(const MouseButton & mouse_button, const vec2 & mouse_pos) {
ComponentManager & mgr = this->mediator.component_manager;
-
+ EventManager& event_mgr = this->mediator.event_manager;
RefVector<Button> buttons = mgr.get_components_by_type<Button>();
-
+
for (Button & button : buttons) {
if (!button.active) continue;
- if (!button.on_click) continue;
+ RefVector<Metadata> metadata_vec
+ = mgr.get_components_by_id<Metadata>(button.game_object_id);
+ Metadata & metadata = metadata_vec.front().get();
RefVector<Transform> transform_vec
= mgr.get_components_by_id<Transform>(button.game_object_id);
Transform & transform = transform_vec.front().get();
if (this->is_mouse_inside_button(mouse_pos, button, transform)) {
-
- button.on_click();
+ event_mgr.trigger_event<ButtonPressEvent>(metadata);
}
}
}
diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h
index eefd9fe..9cad178 100644
--- a/src/crepe/system/InputSystem.h
+++ b/src/crepe/system/InputSystem.h
@@ -5,6 +5,9 @@
#include "../types.h"
#include "../util/OptionalRef.h"
+#include "../api/Metadata.h"
+#include "../api/Event.h"
+
#include "System.h"
@@ -14,6 +17,25 @@ class Camera;
class Button;
class Transform;
/**
+ * \brief Event triggered during a collision between objects.
+ */
+class ButtonPressEvent : public Event {
+public:
+ const Metadata& meta_data;
+ ButtonPressEvent(const Metadata& meta_data) : meta_data(meta_data){};;
+};
+class ButtonEnterEvent : public Event {
+public:
+ const Metadata& meta_data;
+ ButtonEnterEvent(const Metadata& meta_data) : meta_data(meta_data){};
+};
+class ButtonExitEvent : public Event {
+public:
+ const Metadata& meta_data;
+ ButtonExitEvent(const Metadata& meta_data) : meta_data(meta_data){};
+};
+
+/**
* \brief Handles the processing of input events created by SDLContext
*
* This system processes events such as mouse clicks, mouse movement, and keyboard