diff options
Diffstat (limited to 'mwe/events/include')
-rw-r--r-- | mwe/events/include/event.h | 70 | ||||
-rw-r--r-- | mwe/events/include/eventHandler.h | 4 | ||||
-rw-r--r-- | mwe/events/include/gameObject.h | 20 | ||||
-rw-r--r-- | mwe/events/include/iKeyListener.h | 21 | ||||
-rw-r--r-- | mwe/events/include/iMouseListener.h | 23 | ||||
-rw-r--r-- | mwe/events/include/inputSystem.h | 24 | ||||
-rw-r--r-- | mwe/events/include/keyCodes.h | 11 | ||||
-rw-r--r-- | mwe/events/include/keyListenerTest.h | 12 | ||||
-rw-r--r-- | mwe/events/include/loopManager.h | 7 | ||||
-rw-r--r-- | mwe/events/include/mouseListenerTest.h | 14 | ||||
-rw-r--r-- | mwe/events/include/uiObject.h | 70 | ||||
-rw-r--r-- | mwe/events/include/uiRenderer.h | 21 | ||||
-rw-r--r-- | mwe/events/include/window.h | 28 |
13 files changed, 312 insertions, 13 deletions
diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h index 730ee4b..62d8974 100644 --- a/mwe/events/include/event.h +++ b/mwe/events/include/event.h @@ -6,7 +6,8 @@ #include <string> #include <unordered_map> #include <variant> - +#include "keyCodes.h" +#include "customTypes.h" class UUIDGenerator { public: static std::uint32_t getUniqueID() { @@ -63,7 +64,19 @@ public: Keycode key = 0; int repeatCount = 0; }; +class MouseClickEvent : public Event { +public: + MouseClickEvent(int x, int y, MouseButton button); + + REGISTER_EVENT_TYPE("KeyClickedEvent"); + std::pair<int, int> getMousePosition() const; + MouseButton getButton() const { return button; } +private: + int mouseX = 0; + int mouseY = 0; + MouseButton button; +}; // KeyReleasedEvent class class KeyReleasedEvent : public Event { public: @@ -89,6 +102,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: @@ -101,3 +139,33 @@ public: private: Collision collisionData; }; +class TextSubmitEvent : public Event { +public: + TextSubmitEvent(std::string submittedText); + + REGISTER_EVENT_TYPE(TextSubmitEvent) + + std::string getText() const; + +private: + std::string text; +}; +class ShutDownEvent : public Event { +public: + ShutDownEvent() : Event("ShutDownEvent"){}; + + REGISTER_EVENT_TYPE(ShutDownEvent) + +private: +}; +// class ButtonClickEvent : public Event { +// public: +// ButtonClickEvent(int x,int y,int width,int height); + +// REGISTER_EVENT_TYPE(TextSubmitEvent) + +// std::string getText() const; + +// private: +// std::string text; +// }; diff --git a/mwe/events/include/eventHandler.h b/mwe/events/include/eventHandler.h index 7414801..7d8f20a 100644 --- a/mwe/events/include/eventHandler.h +++ b/mwe/events/include/eventHandler.h @@ -1,9 +1,9 @@ #pragma once - #include "event.h" - #include <functional> #include <iostream> + + template <typename EventType> using EventHandler = std::function<void(const EventType & e)>; diff --git a/mwe/events/include/gameObject.h b/mwe/events/include/gameObject.h new file mode 100644 index 0000000..de5f3fe --- /dev/null +++ b/mwe/events/include/gameObject.h @@ -0,0 +1,20 @@ +#pragma once +#include <cstdint> +#include <string> +class GameObject { +public: + GameObject(){} + + // 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..5f39ece --- /dev/null +++ b/mwe/events/include/iKeyListener.h @@ -0,0 +1,21 @@ +#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); + void activate(int listenerId = 0) { subscribeEvents(listenerId); } + void deactivate(int listenerId = 0) { unsubscribeEvents(listenerId); } + +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..7d840c1 --- /dev/null +++ b/mwe/events/include/iMouseListener.h @@ -0,0 +1,23 @@ +#pragma once +#include "event.h" +#include "eventHandler.h" +#include "eventManager.h" + +class IMouseListener { +public: + virtual ~IMouseListener(); + + 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); + void unsubscribeEvents(int listenerId = 0); + +private: + EventHandler<MouseClickEvent> mouseClickHandler; + EventHandler<MousePressedEvent> mousePressHandler; + EventHandler<MouseReleasedEvent> mouseReleaseHandler; + EventHandler<MouseMovedEvent> mouseMoveHandler; +}; diff --git a/mwe/events/include/inputSystem.h b/mwe/events/include/inputSystem.h new file mode 100644 index 0000000..c20562d --- /dev/null +++ b/mwe/events/include/inputSystem.h @@ -0,0 +1,24 @@ +#pragma once +#include <vector> +#include "uiObject.h" +#include "event.h" +#include "keyCodes.h" +#include "eventManager.h" +class InputSystem { +public: + InputSystem(); + void registerButton(Button* button); + void registerText(Text* label); + void registerTextInput(TextInput* input); + void processInput(); + +private: + std::vector<Button*> buttons; + std::vector<TextInput*> textInputs; + std::vector<Text*> texts; + void processMouseClick(int mouseX, int mouseY); + void processInputField(int mouseX, int mouseY); + void processKeyPress(Keycode); + void processTextInput(const std::string& text); + +}; 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/keyListenerTest.h b/mwe/events/include/keyListenerTest.h new file mode 100644 index 0000000..5990cd1 --- /dev/null +++ b/mwe/events/include/keyListenerTest.h @@ -0,0 +1,12 @@ +#pragma once +#include "iKeyListener.h" +#include <iostream> + +class KeyListenerTest : public IKeyListener { +public: + KeyListenerTest(int listenerId); + ~KeyListenerTest(); + + void onKeyPressed(const KeyPressedEvent& event) override; + void onKeyReleased(const KeyReleasedEvent& event) override; +}; diff --git a/mwe/events/include/loopManager.h b/mwe/events/include/loopManager.h index baffb94..289ff0f 100644 --- a/mwe/events/include/loopManager.h +++ b/mwe/events/include/loopManager.h @@ -6,6 +6,10 @@ #include "eventHandler.h" #include "eventManager.h" #include "loopManager.h" +#include "uiRenderer.h" +#include "uiObject.h" +#include "inputSystem.h" +#include <memory> class LoopManager { public: LoopManager(); @@ -19,6 +23,7 @@ private: void lateUpdate(); void fixedUpdate(); void render(); + void onShutdown(const ShutDownEvent& e); bool gameRunning = false; WindowManager window; int timeScale = 1; @@ -26,4 +31,6 @@ private: double currentTime; double t = 0.0; double dt = 0.01; + std::unique_ptr<InputSystem> inputSystem; + EventHandler<ShutDownEvent> shutdownHandler; }; diff --git a/mwe/events/include/mouseListenerTest.h b/mwe/events/include/mouseListenerTest.h new file mode 100644 index 0000000..dae04f5 --- /dev/null +++ b/mwe/events/include/mouseListenerTest.h @@ -0,0 +1,14 @@ +#pragma once +#include "iMouseListener.h" +#include <iostream> + +class MouseListenerTest : public IMouseListener { +public: + MouseListenerTest(int listenerId); + ~MouseListenerTest(); + + void onMouseClicked(const MouseClickEvent& event) override; + void onMousePressed(const MousePressedEvent& event) override; + void onMouseReleased(const MouseReleasedEvent& event) override; + void onMouseMoved(const MouseMovedEvent& event) override; +}; diff --git a/mwe/events/include/uiObject.h b/mwe/events/include/uiObject.h new file mode 100644 index 0000000..893232d --- /dev/null +++ b/mwe/events/include/uiObject.h @@ -0,0 +1,70 @@ +#pragma once +#include "gameObject.h" +#include <SDL2/SDL.h> +#include <SDL_ttf.h> +#include "event.h" +#include "eventHandler.h" +#include <functional> +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); + virtual ~UIObject() {} + int width; + int height; + int x; + int y; +}; +class Button : public UIObject{ + public: + Button(int width,int height); + RGBColor color; + std::function<void()> onClick; + +}; +class Text : public UIObject{ + public: + Text(int width,int height); + 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; + bool isActive = false; + RGBColor textColor; + RGBColor backgroundColor; + size_t maxLength = 100; + Alignment alignment; + TTF_Font* font = nullptr; + std::function<void()> onSubmit; + std::function<void()> onFocus; +}; + diff --git a/mwe/events/include/uiRenderer.h b/mwe/events/include/uiRenderer.h new file mode 100644 index 0000000..32acecf --- /dev/null +++ b/mwe/events/include/uiRenderer.h @@ -0,0 +1,21 @@ +#pragma once +#include <SDL2/SDL.h> +#include <SDL2/SDL_ttf.h> +#include <string> +#include "uiObject.h" + +class UIRenderer { +public: + UIRenderer(SDL_Renderer* renderer); + ~UIRenderer(); + + void render(UIObject* uiObject); + +private: + SDL_Renderer* renderer; + TTF_Font* font; + + void renderButton(Button* button); + void renderText(Text* text); + void renderTextInput(TextInput* textInput); +}; diff --git a/mwe/events/include/window.h b/mwe/events/include/window.h index 9020b1a..3c34d4c 100644 --- a/mwe/events/include/window.h +++ b/mwe/events/include/window.h @@ -1,19 +1,27 @@ #pragma once #include <SDL2/SDL.h> -#include <iostream> #include <vector> +#include "uiObject.h" +#include "uiRenderer.h" + class WindowManager { public: - WindowManager(); - virtual ~WindowManager(); - bool initWindow(); - void destroyWindow(); + WindowManager(); + virtual ~WindowManager(); + + bool initWindow(); + void destroyWindow(); + SDL_Renderer* getRenderer(); - SDL_Renderer * getRenderer(); + void addUIObject(UIObject* uiObject); + void renderUIObjects(); private: - const int SCREEN_WIDTH = 800; - const int SCREEN_HEIGHT = 600; - SDL_Window * window = NULL; - SDL_Renderer * renderer = NULL; + const int SCREEN_WIDTH = 800; + const int SCREEN_HEIGHT = 600; + SDL_Window* window = nullptr; + SDL_Renderer* renderer = nullptr; + + UIRenderer* uiRenderer; + std::vector<UIObject*> uiObjects; }; |