aboutsummaryrefslogtreecommitdiff
path: root/mwe/events/include
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-11-05 16:12:47 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-11-05 16:12:47 +0100
commite36ea050972fcaaf3d85d672755bad4ebb2dcd80 (patch)
tree5145e0b66650eea1df301106b7d197a586be65f3 /mwe/events/include
parent333b07775be1ef20fdb5909672c1e4dcabec1b40 (diff)
parentb770475741b7c33d57331f3139c55a3f237ad274 (diff)
merge `master` into `loek/savemgr`loek/savemgr
Diffstat (limited to 'mwe/events/include')
-rw-r--r--mwe/events/include/event.h70
-rw-r--r--mwe/events/include/eventHandler.h3
-rw-r--r--mwe/events/include/gameObject.h20
-rw-r--r--mwe/events/include/iKeyListener.h20
-rw-r--r--mwe/events/include/iMouseListener.h24
-rw-r--r--mwe/events/include/inputSystem.h23
-rw-r--r--mwe/events/include/keyCodes.h11
-rw-r--r--mwe/events/include/keyListenerTest.h12
-rw-r--r--mwe/events/include/loopManager.h7
-rw-r--r--mwe/events/include/mouseListenerTest.h14
-rw-r--r--mwe/events/include/uiObject.h68
-rw-r--r--mwe/events/include/uiRenderer.h21
-rw-r--r--mwe/events/include/window.h16
13 files changed, 302 insertions, 7 deletions
diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h
index 730ee4b..16c75bf 100644
--- a/mwe/events/include/event.h
+++ b/mwe/events/include/event.h
@@ -6,7 +6,6 @@
#include <string>
#include <unordered_map>
#include <variant>
-
class UUIDGenerator {
public:
static std::uint32_t getUniqueID() {
@@ -63,7 +62,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 +100,33 @@ 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..aa8f63b 100644
--- a/mwe/events/include/eventHandler.h
+++ b/mwe/events/include/eventHandler.h
@@ -1,9 +1,8 @@
#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..48e239b
--- /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..5fee2eb
--- /dev/null
+++ b/mwe/events/include/iKeyListener.h
@@ -0,0 +1,20 @@
+#pragma once
+#include "event.h"
+#include "eventHandler.h"
+#include "eventManager.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..5b1181c
--- /dev/null
+++ b/mwe/events/include/iMouseListener.h
@@ -0,0 +1,24 @@
+#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..3e53b7c
--- /dev/null
+++ b/mwe/events/include/inputSystem.h
@@ -0,0 +1,23 @@
+#pragma once
+#include "event.h"
+#include "eventManager.h"
+#include "keyCodes.h"
+#include "uiObject.h"
+#include <vector>
+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..73ba1cd 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..08f3feb
--- /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..9959c94 100644
--- a/mwe/events/include/loopManager.h
+++ b/mwe/events/include/loopManager.h
@@ -5,7 +5,11 @@
//#include "combinedEvent.h"
#include "eventHandler.h"
#include "eventManager.h"
+#include "inputSystem.h"
#include "loopManager.h"
+#include "uiObject.h"
+#include "uiRenderer.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..ca9afc5
--- /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..23efe44
--- /dev/null
+++ b/mwe/events/include/uiObject.h
@@ -0,0 +1,68 @@
+#pragma once
+#include "event.h"
+#include "eventHandler.h"
+#include "gameObject.h"
+#include <SDL2/SDL.h>
+#include <SDL_ttf.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..8f22fdf
--- /dev/null
+++ b/mwe/events/include/uiRenderer.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "uiObject.h"
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_ttf.h>
+#include <string>
+
+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..bd75c4a 100644
--- a/mwe/events/include/window.h
+++ b/mwe/events/include/window.h
@@ -1,19 +1,27 @@
#pragma once
+#include "uiObject.h"
+#include "uiRenderer.h"
#include <SDL2/SDL.h>
-#include <iostream>
#include <vector>
+
class WindowManager {
public:
WindowManager();
virtual ~WindowManager();
+
bool initWindow();
void destroyWindow();
-
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;
+ SDL_Window * window = nullptr;
+ SDL_Renderer * renderer = nullptr;
+
+ UIRenderer * uiRenderer;
+ std::vector<UIObject *> uiObjects;
};