diff options
author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-28 11:06:21 +0100 |
---|---|---|
committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-28 11:06:21 +0100 |
commit | 29f9a26046e35c7eb0157df92757ce8e39f1ec74 (patch) | |
tree | 18be4912561c2fcc9a57b99466c74977e11f2abf | |
parent | f1b2c5a38f49bb319babf11bf64c420a63e104f2 (diff) |
iMouseListener and iKeyListener implementation
-rw-r--r-- | mwe/events/CMakeLists.txt | 3 | ||||
-rw-r--r-- | mwe/events/font/Arial.ttf | bin | 0 -> 275572 bytes | |||
-rw-r--r-- | mwe/events/include/event.h | 51 | ||||
-rw-r--r-- | mwe/events/include/gameObject.h | 20 | ||||
-rw-r--r-- | mwe/events/include/iKeyListener.h | 19 | ||||
-rw-r--r-- | mwe/events/include/iMouseListener.h | 40 | ||||
-rw-r--r-- | mwe/events/include/keyCodes.h | 11 | ||||
-rw-r--r-- | mwe/events/include/uiObject.h | 66 | ||||
-rw-r--r-- | mwe/events/src/event.cpp | 8 | ||||
-rw-r--r-- | mwe/events/src/iKeyListener.cpp | 18 | ||||
-rw-r--r-- | mwe/events/src/iMouseListener.cpp | 23 | ||||
-rw-r--r-- | mwe/events/src/uiObject.cpp | 28 |
12 files changed, 286 insertions, 1 deletions
diff --git a/mwe/events/CMakeLists.txt b/mwe/events/CMakeLists.txt index 585d869..e429516 100644 --- a/mwe/events/CMakeLists.txt +++ b/mwe/events/CMakeLists.txt @@ -21,7 +21,7 @@ add_executable(gameloop src/keyCodes.cpp src/eventHandler.cpp ) - +add_subdirectory(../../lib/SDL_ttf SDL_ttf) # Link the SDL2 library to your project target_link_libraries(gameloop ${SDL2_LIBRARIES}) @@ -29,3 +29,4 @@ target_link_libraries(gameloop ${SDL2_LIBRARIES}) target_include_directories(gameloop PRIVATE ${SDL2_INCLUDE_DIRS}) target_include_directories(gameloop PRIVATE ${CMAKE_SOURCE_DIR}/include) +file(COPY ${PROJECT_SOURCE_DIR}/font DESTINATION ${CMAKE_BINARY_DIR}) diff --git a/mwe/events/font/Arial.ttf b/mwe/events/font/Arial.ttf Binary files differnew file mode 100644 index 0000000..7ff88f2 --- /dev/null +++ b/mwe/events/font/Arial.ttf diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h index 0208085..8968c6c 100644 --- a/mwe/events/include/event.h +++ b/mwe/events/include/event.h @@ -64,7 +64,20 @@ public: Keycode key = 0; int repeatCount = 0; }; +class MouseClickEvent : public Event { +public: + MouseClickEvent(int x, int y, MouseButton button); + + REGISTER_EVENT_TYPE("KeyClickedEvent"); + int getX() const { return x; } + int getY() const { return y; } + MouseButton getButton() const { return button; } +private: + int x; + int y; + MouseButton button; +}; // KeyReleasedEvent class class KeyReleasedEvent : public Event { public: @@ -90,6 +103,31 @@ public: private: int mouseX = 0; int mouseY = 0; + MouseButton button; +}; +class MouseReleasedEvent : public Event { +public: + MouseReleasedEvent(int mouseX, int mouseY, MouseButton button); + + REGISTER_EVENT_TYPE(MouseReleasedEvent) + + std::pair<int, int> getMousePosition() const; + MouseButton getMouseButton() const; +private: + int mouseX = 0; + int mouseY = 0; + MouseButton button; +}; +class MouseMovedEvent : public Event { +public: + MouseMovedEvent(int mouseX, int mouseY); + + REGISTER_EVENT_TYPE(MouseMovedEvent) + + std::pair<int, int> getMousePosition() const; +private: + int mouseX = 0; + int mouseY = 0; }; class CollisionEvent : public Event { public: @@ -103,3 +141,16 @@ private: Collision collisionData; }; +class TextSubmitEvent : public Event { +public: + TextSubmitEvent(std::string submittedText); + + REGISTER_EVENT_TYPE(TextSubmitEvent) + + std::string getText() const { + return text; + } + +private: + std::string text; +}; diff --git a/mwe/events/include/gameObject.h b/mwe/events/include/gameObject.h new file mode 100644 index 0000000..70d4517 --- /dev/null +++ b/mwe/events/include/gameObject.h @@ -0,0 +1,20 @@ +#pragma once +#include <cstdint> +#include <string> +class GameObject { +public: + GameObject(std::uint32_t id, std::string name, std::string tag, int layer); + + template <typename... Args> + void addSpriteComponent(Args &&... args); + template <typename... Args> + void addRigidbodyComponent(Args &&... args); + template <typename... Args> + void addColiderComponent(Args &&... args); + + std::uint32_t mId; + std::string mName; + std::string mTag; + bool mActive; + int mLayer; +}; diff --git a/mwe/events/include/iKeyListener.h b/mwe/events/include/iKeyListener.h new file mode 100644 index 0000000..87ee1d5 --- /dev/null +++ b/mwe/events/include/iKeyListener.h @@ -0,0 +1,19 @@ +#pragma once +#include "event.h" +#include "eventManager.h" +#include "eventHandler.h" +class IKeyListener { +public: + virtual ~IKeyListener(); + virtual void onKeyPressed(const KeyPressedEvent& event) = 0; + virtual void onKeyReleased(const KeyReleasedEvent& event) = 0; + +protected: + void subscribeEvents(int listenerId = 0); + void unsubscribeEvents(int listenerId = 0); + +private: + EventHandler<KeyPressedEvent> keyPressedHandler; + EventHandler<KeyReleasedEvent> keyReleasedHandler; +}; + diff --git a/mwe/events/include/iMouseListener.h b/mwe/events/include/iMouseListener.h new file mode 100644 index 0000000..7ae371c --- /dev/null +++ b/mwe/events/include/iMouseListener.h @@ -0,0 +1,40 @@ +#include "event.h" +#include "eventManager.h" +#include "eventHandler.h" +class IMouseListener { +public: + virtual ~IMouseListener() { + unsubscribeEvents(); + } + + virtual void onMouseClicked(const MouseClickEvent& event) = 0; + virtual void onMousePressed(const MousePressedEvent& event) = 0; + virtual void onMouseReleased(const MouseReleasedEvent& event) = 0; + virtual void onMouseMoved(const MouseMovedEvent& event) = 0; + +protected: + void subscribeEvents(int listenerId = 0) { + mouseClickHandler = [this](const MouseClickEvent& event) { this->onMouseClicked(event); }; + mousePressHandler = [this](const MousePressedEvent& event) { this->onMousePressed(event); }; + mouseReleaseHandler = [this](const MouseReleasedEvent& event) { this->onMouseReleased(event); }; + mouseMoveHandler = [this](const MouseMovedEvent& event) { this->onMouseMoved(event); }; + + subscribe<MouseClickEvent>(mouseClickHandler, listenerId); + subscribe<MousePressedEvent>(mousePressHandler, listenerId); + subscribe<MouseReleasedEvent>(mouseReleaseHandler, listenerId); + subscribe<MouseMovedEvent>(mouseMoveHandler, listenerId); + } + + void unsubscribeEvents(int listenerId = 0) { + unsubscribe<MouseClickEvent>(mouseClickHandler, listenerId); + unsubscribe<MousePressedEvent>(mousePressHandler, listenerId); + unsubscribe<MouseReleasedEvent>(mouseReleaseHandler, listenerId); + unsubscribe<MouseMovedEvent>(mouseMoveHandler, listenerId); + } + +private: + EventHandler<MouseClickEvent> mouseClickHandler; + EventHandler<MousePressedEvent> mousePressHandler; + EventHandler<MouseReleasedEvent> mouseReleaseHandler; + EventHandler<MouseMovedEvent> mouseMoveHandler; +}; diff --git a/mwe/events/include/keyCodes.h b/mwe/events/include/keyCodes.h index 0879efc..61deba2 100644 --- a/mwe/events/include/keyCodes.h +++ b/mwe/events/include/keyCodes.h @@ -3,6 +3,16 @@ #include <cstdint> #include <unordered_map> using Keycode = uint16_t; +enum class MouseButton { + None = 0, + Left_Mouse = 1, + Right_Mouse = 2, + Middle_Mouse = 3, + X1_Mouse = 4, + X2_Mouse = 5, + Scroll_Up = 6, + Scroll_Down = 7, +}; enum : Keycode { // From glfw3.h Space = 32, @@ -136,6 +146,7 @@ enum : Keycode { RightSuper = 347, Menu = 348 }; + // Define the mapping extern const std::unordered_map<SDL_Keycode, Keycode> sdlToCustom; diff --git a/mwe/events/include/uiObject.h b/mwe/events/include/uiObject.h new file mode 100644 index 0000000..46d32be --- /dev/null +++ b/mwe/events/include/uiObject.h @@ -0,0 +1,66 @@ +#include "gameObject.h" +#include <SDL2/SDL.h> +#include <SDL_ttf.h> +#include "event.h" +#include "eventHandler.h" +struct Alignment { + enum class Horizontal { LEFT, CENTER, RIGHT }; + enum class Vertical { TOP, MIDDLE, BOTTOM }; + enum class PositioningMode { RELATIVE, STATIC,ABSOLUTE }; + + Horizontal horizontal = Horizontal::CENTER; + Vertical vertical = Vertical::MIDDLE; + PositioningMode mode = PositioningMode::RELATIVE; + + int staticX = 0; + int staticY = 0; + + int marginTop = 0; + int marginBottom = 0; + int marginLeft = 0; + int marginRight = 0; +}; +struct RGBColor{ + int red, + int green, + int blue +}; +class UIObject : public GameObject{ + public: + UIObject(int width,int height); + private: + int width; + int height; +}; +class Button : public UIObject{ + public: + Button(int width,int height); + EventHandler<KeyPressedEvent> onKeyPressed; + EventHandler<KeyReleasedEvent> onKeyReleased; + +}; +class Text : public UIObject{ + public: + Text(int width,int height); + private: + std::string text; + int size; + Alignment alignment; + //font resource + TTF_Font *font; + RGBColor color; +}; +class TextInput : public UIObject{ + public: + TextInput (int width,int height); + std::string textBuffer; + std::string placeholder; + size_t caretPosition; + bool isActive; + RGBColor textColor; + RGBColor backgroundColor; + size_t maxLength; + Alignment alignment; + TTF_Font* font; + EventHandler<TextSubmitEvent> onSubmit; +}; diff --git a/mwe/events/src/event.cpp b/mwe/events/src/event.cpp index 38ff62a..2509088 100644 --- a/mwe/events/src/event.cpp +++ b/mwe/events/src/event.cpp @@ -52,3 +52,11 @@ Collision CollisionEvent::getCollisionData() const { return this->collisionData; } + +TextSubmitEvent::TextSubmitEvent(std::string text) : Event("TextSubmitEvent"){ + +} +std::string TextSubmitEvent::getText() const{ + return this->text; +} + diff --git a/mwe/events/src/iKeyListener.cpp b/mwe/events/src/iKeyListener.cpp new file mode 100644 index 0000000..59cc89a --- /dev/null +++ b/mwe/events/src/iKeyListener.cpp @@ -0,0 +1,18 @@ +#include "iKeyListener.h" + +IKeyListener::~IKeyListener() { + unsubscribeEvents(); +} + +void IKeyListener::subscribeEvents(int listenerId) { + keyPressedHandler = [this](const KeyPressedEvent& event) { this->onKeyPressed(event); }; + keyReleasedHandler = [this](const KeyReleasedEvent& event) { this->onKeyReleased(event); }; + + subscribe<KeyPressedEvent>(keyPressedHandler, listenerId); + subscribe<KeyReleasedEvent>(keyReleasedHandler, listenerId); +} + +void IKeyListener::unsubscribeEvents(int listenerId) { + unsubscribe<KeyPressedEvent>(keyPressedHandler, listenerId); + unsubscribe<KeyReleasedEvent>(keyReleasedHandler, listenerId); +} diff --git a/mwe/events/src/iMouseListener.cpp b/mwe/events/src/iMouseListener.cpp new file mode 100644 index 0000000..3239304 --- /dev/null +++ b/mwe/events/src/iMouseListener.cpp @@ -0,0 +1,23 @@ +#include "iMouseListener.h" +IMouseListener::~IMouseListener() { + unsubscribeEvents(); +} + +void IMouseListener::subscribeEvents(int listenerId) { + mouseClickHandler = [this](const MouseClickEvent& event) { this->onMouseClicked(event); }; + mousePressHandler = [this](const MousePressedEvent& event) { this->onMousePressed(event); }; + mouseReleaseHandler = [this](const MouseReleasedEvent& event) { this->onMouseReleased(event); }; + mouseMoveHandler = [this](const MouseMovedEvent& event) { this->onMouseMoved(event); }; + + subscribe<MouseClickEvent>(mouseClickHandler, listenerId); + subscribe<MousePressedEvent>(mousePressHandler, listenerId); + subscribe<MouseReleasedEvent>(mouseReleaseHandler, listenerId); + subscribe<MouseMovedEvent>(mouseMoveHandler, listenerId); +} + +void IMouseListener::unsubscribeEvents(int listenerId) { + unsubscribe<MouseClickEvent>(mouseClickHandler, listenerId); + unsubscribe<MousePressedEvent>(mousePressHandler, listenerId); + unsubscribe<MouseReleasedEvent>(mouseReleaseHandler, listenerId); + unsubscribe<MouseMovedEvent>(mouseMoveHandler, listenerId); +} diff --git a/mwe/events/src/uiObject.cpp b/mwe/events/src/uiObject.cpp new file mode 100644 index 0000000..b941858 --- /dev/null +++ b/mwe/events/src/uiObject.cpp @@ -0,0 +1,28 @@ +#include "uiObject.h" + +// Constructor for UIObject +UIObject::UIObject(int width, int height) + : width(width), height(height) { + + } + +// Constructor for Button +Button::Button(int width, int height) + : UIObject(width, height) { +} + +Text::Text(int width, int height) + : UIObject(width, height), size(12), font(nullptr), color{255, 255, 255} { // Default size and color + alignment.horizontal = Alignment::Horizontal::CENTER; + alignment.vertical = Alignment::Vertical::MIDDLE; + alignment.mode = Alignment::PositioningMode::RELATIVE; +} + +TextInput::TextInput(int width, int height) + : UIObject(width, height), textBuffer(""), placeholder(""), caretPosition(0), + isActive(false), textColor{255, 255, 255}, backgroundColor{0, 0, 0}, maxLength(100), font(nullptr) { + alignment.horizontal = Alignment::Horizontal::LEFT; + alignment.vertical = Alignment::Vertical::TOP; + alignment.mode = Alignment::PositioningMode::RELATIVE; +} + |