aboutsummaryrefslogtreecommitdiff
path: root/mwe/events/src
diff options
context:
space:
mode:
Diffstat (limited to 'mwe/events/src')
-rw-r--r--mwe/events/src/event.cpp4
-rw-r--r--mwe/events/src/inputSystem.cpp39
-rw-r--r--mwe/events/src/loopManager.cpp61
-rw-r--r--mwe/events/src/uiObject.cpp2
-rw-r--r--mwe/events/src/uiRenderer.cpp72
-rw-r--r--mwe/events/src/window.cpp74
6 files changed, 202 insertions, 50 deletions
diff --git a/mwe/events/src/event.cpp b/mwe/events/src/event.cpp
index fc8eec9..0a7454d 100644
--- a/mwe/events/src/event.cpp
+++ b/mwe/events/src/event.cpp
@@ -54,7 +54,9 @@ Collision CollisionEvent::getCollisionData() const
}
TextSubmitEvent::TextSubmitEvent(std::string text)
- : text(text), Event("TextSubmitEvent") {}
+ : text(text), Event("TextSubmitEvent") {
+
+ }
std::string TextSubmitEvent::getText() const {
return this->text;
diff --git a/mwe/events/src/inputSystem.cpp b/mwe/events/src/inputSystem.cpp
new file mode 100644
index 0000000..ffab84b
--- /dev/null
+++ b/mwe/events/src/inputSystem.cpp
@@ -0,0 +1,39 @@
+#include "inputSystem.h"
+
+InputSystem::InputSystem() {}
+
+void InputSystem::registerButton(Button* button) {
+ buttons.push_back(button);
+}
+
+void InputSystem::processInput() {
+
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+ switch (event.type) {
+ case SDL_QUIT:
+ triggerEvent(ShutDownEvent());
+ break;
+ case SDL_KEYDOWN:
+ triggerEvent(KeyPressedEvent(getCustomKey(event.key.keysym.sym)));
+ break;
+ case SDL_MOUSEBUTTONDOWN: {
+ int mouseX, mouseY;
+ SDL_GetMouseState(&mouseX, &mouseY);
+ processMouseClick(mouseX, mouseY);
+ triggerEvent(MousePressedEvent(mouseX, mouseY));
+ break;
+ }
+ }
+ }
+}
+
+void InputSystem::processMouseClick(int mouseX, int mouseY) {
+ for (auto* button : buttons) {
+ if (mouseX >= button->x && mouseX <= (button->x + button->width) &&
+ mouseY >= button->y && mouseY <= (button->y + button->height)) {
+ button->onClick();
+ }
+ }
+}
+
diff --git a/mwe/events/src/loopManager.cpp b/mwe/events/src/loopManager.cpp
index 8ecb932..83ccfc3 100644
--- a/mwe/events/src/loopManager.cpp
+++ b/mwe/events/src/loopManager.cpp
@@ -1,22 +1,27 @@
#include "loopManager.h"
-LoopManager::LoopManager() {}
+LoopManager::LoopManager()
+ : inputSystem(std::make_unique<InputSystem>()){
+ shutdownHandler = [this](const ShutDownEvent& event) { this->onShutdown(event); };
+ subscribe(shutdownHandler);
+}
void LoopManager::processInput() {
- SDL_Event event;
- SDL_PollEvent(&event);
- switch (event.type) {
- case SDL_QUIT:
- gameRunning = false;
- break;
- case SDL_KEYDOWN:
- triggerEvent(KeyPressedEvent(getCustomKey(event.key.keysym.sym)));
- break;
- case SDL_MOUSEBUTTONDOWN:
- int x, y;
- SDL_GetMouseState(&x, &y);
- triggerEvent(MousePressedEvent(x, y));
- break;
- }
+ inputSystem->processInput();
+ // SDL_Event event;
+ // SDL_PollEvent(&event);
+ // switch (event.type) {
+ // case SDL_QUIT:
+ // gameRunning = false;
+ // break;
+ // case SDL_KEYDOWN:
+ // triggerEvent(KeyPressedEvent(getCustomKey(event.key.keysym.sym)));
+ // break;
+ // case SDL_MOUSEBUTTONDOWN:
+ // int x, y;
+ // SDL_GetMouseState(&x, &y);
+ // triggerEvent(MousePressedEvent(x, y));
+ // break;
+ // }
}
void LoopManager::setRunning(bool running) { this->gameRunning = running; }
void LoopManager::fixedUpdate() {
@@ -28,9 +33,8 @@ void LoopManager::loop() {
while (gameRunning) {
timer.update();
-
+ processInput();
while (timer.getLag() >= timer.getFixedDeltaTime()) {
- processInput();
fixedUpdate();
timer.advanceFixedUpdate();
}
@@ -66,22 +70,29 @@ void LoopManager::setup() {
}
};
subscribe<KeyPressedEvent>(closeWindowCallback, false);
+ Button* testButton = new Button(200,200);
+ testButton->color = {100,0,100};
+ testButton->onClick = []() {
+ std::cout << "Button was clicked" << std::endl;
+ };
+ testButton->x = 200;
+ testButton->y = 200;
+ inputSystem->registerButton(testButton);
+
+ window.addUIObject(testButton);
}
void LoopManager::render() {
//fprintf(stderr, "**********render********** \n");
if (gameRunning) {
- //window.render(objectList);
+ window.renderUIObjects();
}
}
-
+void LoopManager::onShutdown(const ShutDownEvent& e){
+ this->gameRunning = false;
+}
void LoopManager::update() {
//fprintf(stderr, "**********normal update********** \n");
LoopTimer & timer = LoopTimer::getInstance();
float delta = timer.getDeltaTime();
-
- // for (int i = 0; i < objectList.size(); i++) {
- // objectList[i]->setX(objectList[i]->getX() + 50 * delta);
- // objectList[i]->setY(objectList[i]->getY() + 50 * delta);
- // }
}
diff --git a/mwe/events/src/uiObject.cpp b/mwe/events/src/uiObject.cpp
index b941858..ef4443f 100644
--- a/mwe/events/src/uiObject.cpp
+++ b/mwe/events/src/uiObject.cpp
@@ -2,7 +2,7 @@
// Constructor for UIObject
UIObject::UIObject(int width, int height)
- : width(width), height(height) {
+ : width(width), height(height){
}
diff --git a/mwe/events/src/uiRenderer.cpp b/mwe/events/src/uiRenderer.cpp
new file mode 100644
index 0000000..4a756f9
--- /dev/null
+++ b/mwe/events/src/uiRenderer.cpp
@@ -0,0 +1,72 @@
+#include "uiRenderer.h"
+
+// Constructor
+UIRenderer::UIRenderer(SDL_Renderer* renderer) : renderer(renderer) {}
+
+// Render function
+void UIRenderer::render(UIObject* uiObject) {
+ if (Button* button = dynamic_cast<Button*>(uiObject)) {
+ renderButton(button);
+ } else if (Text* text = dynamic_cast<Text*>(uiObject)) {
+ renderText(text);
+ } else if (TextInput* textInput = dynamic_cast<TextInput*>(uiObject)) {
+ renderTextInput(textInput);
+ }
+}
+
+// Private helper function to render a Button
+void UIRenderer::renderButton(Button* button) {
+ SDL_Rect buttonRect = {button->x, button->y, button->width, button->height};
+ SDL_SetRenderDrawColor(renderer, 100, 100, 255, 255); // Button color
+ SDL_RenderFillRect(renderer, &buttonRect);
+}
+
+// Private helper function to render a Text
+void UIRenderer::renderText(Text* text) {
+ if (text->font != nullptr) {
+ SDL_Color sdlColor = {text->color.red, text->color.green, text->color.blue, 255};
+ SDL_Surface* textSurface = TTF_RenderText_Blended(text->font, text->text.c_str(), sdlColor);
+ if (!textSurface) {
+ std::cerr << "Error creating text surface: " << TTF_GetError() << std::endl;
+ return;
+ }
+
+ SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
+ if (!textTexture) {
+ std::cerr << "Error creating texture from surface: " << SDL_GetError() << std::endl;
+ SDL_FreeSurface(textSurface);
+ return;
+ }
+
+ SDL_Rect textRect = {text->x, text->y, textSurface->w, textSurface->h};
+ SDL_RenderCopy(renderer, textTexture, nullptr, &textRect);
+ SDL_FreeSurface(textSurface);
+ SDL_DestroyTexture(textTexture);
+ }
+}
+
+// Private helper function to render a TextInput
+void UIRenderer::renderTextInput(TextInput* textInput) {
+ SDL_Rect inputRect = {textInput->x, textInput->y, textInput->width, textInput->height};
+ SDL_SetRenderDrawColor(renderer, textInput->backgroundColor.red, textInput->backgroundColor.green, textInput->backgroundColor.blue, 255);
+ SDL_RenderFillRect(renderer, &inputRect);
+
+ // Render text or placeholder
+ if (!textInput->textBuffer.empty()) {
+ SDL_Color sdlColor = {textInput->textColor.red, textInput->textColor.green, textInput->textColor.blue, 255};
+ SDL_Surface* textSurface = TTF_RenderText_Blended(textInput->font, textInput->textBuffer.c_str(), sdlColor);
+ SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
+ SDL_Rect textRect = {textInput->x + 5, textInput->y + 5, textSurface->w, textSurface->h};
+ SDL_RenderCopy(renderer, textTexture, nullptr, &textRect);
+ SDL_FreeSurface(textSurface);
+ SDL_DestroyTexture(textTexture);
+ } else if (!textInput->placeholder.empty()) {
+ SDL_Color sdlColor = {128, 128, 128, 255}; // Placeholder color
+ SDL_Surface* placeholderSurface = TTF_RenderText_Blended(textInput->font, textInput->placeholder.c_str(), sdlColor);
+ SDL_Texture* placeholderTexture = SDL_CreateTextureFromSurface(renderer, placeholderSurface);
+ SDL_Rect placeholderRect = {textInput->x + 5, textInput->y + 5, placeholderSurface->w, placeholderSurface->h};
+ SDL_RenderCopy(renderer, placeholderTexture, nullptr, &placeholderRect);
+ SDL_FreeSurface(placeholderSurface);
+ SDL_DestroyTexture(placeholderTexture);
+ }
+}
diff --git a/mwe/events/src/window.cpp b/mwe/events/src/window.cpp
index 41eb85f..a3bae40 100644
--- a/mwe/events/src/window.cpp
+++ b/mwe/events/src/window.cpp
@@ -1,29 +1,57 @@
#include "window.h"
-WindowManager::WindowManager() {}
-WindowManager::~WindowManager() { destroyWindow(); }
-SDL_Renderer * WindowManager::getRenderer() { return renderer; }
+#include <iostream>
+
+
+WindowManager::WindowManager() {
+ this->uiRenderer = nullptr;
+}
+
+
+WindowManager::~WindowManager() {
+ destroyWindow();
+}
bool WindowManager::initWindow() {
- if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
- fprintf(stderr, "Error inititalising SDL.\n");
- return false;
- }
- window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH,
- SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
- if (!window) {
- fprintf(stderr, "Error creating SDL Window. \n");
- return false;
- }
- renderer = SDL_CreateRenderer(window, -1, 0);
- if (!renderer) {
- fprintf(stderr, "Error creating SDL renderer. \n");
- return false;
- }
- return true;
+ if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
+ std::cerr << "Error initializing SDL.\n";
+ return false;
+ }
+
+ window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED,
+ SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH,
+ SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
+ if (!window) {
+ std::cerr << "Error creating SDL Window.\n";
+ return false;
+ }
+
+ renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+ if (!renderer) {
+ std::cerr << "Error creating SDL renderer.\n";
+ return false;
+ }
+
+ uiRenderer = new UIRenderer(renderer);
+ return true;
}
+
void WindowManager::destroyWindow() {
- SDL_DestroyRenderer(renderer);
- SDL_DestroyWindow(window);
- SDL_Quit();
+ delete uiRenderer;
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+}
+
+SDL_Renderer* WindowManager::getRenderer() {
+ return renderer;
+}
+void WindowManager::addUIObject(UIObject* uiObject) {
+ uiObjects.push_back(uiObject);
+}
+
+void WindowManager::renderUIObjects() {
+ for (UIObject* obj : uiObjects) {
+ uiRenderer->render(obj);
+ }
+ SDL_RenderPresent(this->renderer);
}