aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/facade/SDLContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/facade/SDLContext.cpp')
-rw-r--r--src/crepe/facade/SDLContext.cpp114
1 files changed, 92 insertions, 22 deletions
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index bd2d33b..8a02f4c 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -82,34 +82,84 @@ SDLContext::~SDLContext() {
SDL_Quit();
}
-void SDLContext::handle_events(bool & running) {
- EventManager& event_manager = EventManager::get_instance();
- //TODO: wouter i need events
- SDL_Event event;
- SDL_PollEvent(&event);
- switch (event.type) {
- case SDL_QUIT:
- running = false;
- break;
- case SDL_KEYDOWN:
- event_manager.trigger_event(KeyPressEvent{
- .key = this->sdl_to_keycode(event.key.keysym.sym),
- .repeat = event.key.repeat
- });
- break;
- case SDL_MOUSEBUTTONDOWN:
- int x, y;
- SDL_GetMouseState(&x, &y);
- triggerEvent(MousePressedEvent(x, y));
- break;
- }
+void SDLContext::handle_events(bool &running) {
+ EventManager& event_manager = EventManager::get_instance();
+ SDL_Event event;
+
+ while (SDL_PollEvent(&event)) {
+ switch (event.type) {
+ case SDL_QUIT:
+ running = false;
+ event_manager.trigger_event(ShutDownEvent{});
+ break;
+
+ case SDL_KEYDOWN:
+ std::cout << "keyDown: " << event.key.keysym.sym << std::endl;
+ event_manager.trigger_event<KeyPressEvent>(KeyPressEvent{
+ .repeat = event.key.repeat,
+ .key = this->sdl_to_keycode(event.key.keysym.scancode)
+ });
+ break;
+
+ case SDL_KEYUP:
+ event_manager.trigger_event<KeyReleaseEvent>(KeyReleaseEvent{
+ .key = this->sdl_to_keycode(event.key.keysym.scancode),
+ });
+ break;
+
+ case SDL_MOUSEBUTTONDOWN:
+ {
+ int x, y;
+ SDL_GetMouseState(&x, &y);
+ event_manager.trigger_event<MousePressEvent>(MousePressEvent{
+ .mouse_x = x,
+ .mouse_y = y,
+ .button = this->sdl_to_mousebutton(event.button.button)
+ });
+ }
+ break;
+
+ case SDL_MOUSEBUTTONUP:
+ {
+ int x, y;
+ SDL_GetMouseState(&x, &y);
+ event_manager.trigger_event<MouseReleaseEvent>(MouseReleaseEvent{
+ .mouse_x = x,
+ .mouse_y = y,
+ .button = this->sdl_to_mousebutton(event.button.button)
+ });
+ }
+ break;
+
+ case SDL_MOUSEMOTION:
+ event_manager.trigger_event<MouseMoveEvent>(MouseMoveEvent{
+ .mouse_x = event.motion.x,
+ .mouse_y = event.motion.y,
+ .rel_x = event.motion.xrel,
+ .rel_y = event.motion.yrel
+ });
+ break;
+
+ case SDL_MOUSEWHEEL:
+ event_manager.trigger_event<MouseScrollEvent>(MouseScrollEvent{
+ .scroll_x = event.wheel.x,
+ .scroll_y = event.wheel.y,
+ .direction = (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1 : 1)
+ });
+ break;
+
+ // Add more events as needed for your application.
+ }
+ }
}
+
Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] {
std::array<Keycode, SDL_NUM_SCANCODES> table{};
- table.fill(Keycode::NONE); // Default to NONE for unmapped keys
+ // Default to NONE for unmapped keys
+ table.fill(Keycode::NONE);
table[SDL_SCANCODE_SPACE] = Keycode::SPACE;
table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE;
@@ -219,7 +269,27 @@ Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) {
return LOOKUP_TABLE[sdl_key];
}
+MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) {
+ static const std::array<MouseButton, 8> MOUSE_BUTTON_LOOKUP_TABLE = [] {
+ std::array<MouseButton, 8> table{};
+ table.fill(MouseButton::NONE); // Default to NONE for unmapped buttons
+
+ table[SDL_BUTTON_LEFT] = MouseButton::LEFT_MOUSE;
+ table[SDL_BUTTON_RIGHT] = MouseButton::RIGHT_MOUSE;
+ table[SDL_BUTTON_MIDDLE] = MouseButton::MIDDLE_MOUSE;
+ table[SDL_BUTTON_X1] = MouseButton::X1_MOUSE;
+ table[SDL_BUTTON_X2] = MouseButton::X2_MOUSE;
+
+ return table;
+ }();
+ if (sdl_button >= MOUSE_BUTTON_LOOKUP_TABLE.size()) {
+ // Return NONE for invalid or unmapped button
+ return MouseButton::NONE;
+ }
+
+ return MOUSE_BUTTON_LOOKUP_TABLE[sdl_button]; // Return mapped button
+}
void SDLContext::clear_screen() { SDL_RenderClear(this->game_renderer.get()); }
void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); }