From 289ecc3a3829e9b3acff0b1778f75bc526173977 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 7 Dec 2024 19:14:34 +0100 Subject: changed double to float --- src/crepe/Particle.cpp | 4 ++-- src/crepe/Particle.h | 8 ++++---- src/crepe/api/ParticleEmitter.cpp | 5 +++-- src/crepe/api/ParticleEmitter.h | 29 +++++++++++++++------------- src/crepe/system/ParticleSystem.cpp | 38 ++++++++++++++++++------------------- src/crepe/system/ParticleSystem.h | 6 +++--- 6 files changed, 47 insertions(+), 43 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp index 485a0d4..ce000a1 100644 --- a/src/crepe/Particle.cpp +++ b/src/crepe/Particle.cpp @@ -2,8 +2,8 @@ using namespace crepe; -void Particle::reset(uint32_t lifespan, const vec2 & position, const vec2 & velocity, - double angle) { +void Particle::reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, + float angle) { // Initialize the particle state this->time_in_life = 0; this->lifespan = lifespan; diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index d0397c9..4fa93a1 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -24,13 +24,13 @@ public: //! Accumulated force affecting the particle over time. vec2 force_over_time; //! Total lifespan of the particle in milliseconds. - uint32_t lifespan; + unsigned int lifespan; //! Active state of the particle; true if it is in use, false otherwise. bool active = false; //! The time the particle has been alive, in milliseconds. - uint32_t time_in_life = 0; + unsigned int time_in_life = 0; //! The angle at which the particle is oriented or moving. - double angle = 0; + float angle = 0; /** * \brief Resets the particle with new properties. @@ -43,7 +43,7 @@ public: * \param velocity The initial velocity of the particle. * \param angle The angle of the particle's trajectory or orientation. */ - void reset(uint32_t lifespan, const vec2 & position, const vec2 & velocity, double angle); + void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, float angle); /** * \brief Updates the particle's state. * diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp index 90b77a0..1cfdceb 100644 --- a/src/crepe/api/ParticleEmitter.cpp +++ b/src/crepe/api/ParticleEmitter.cpp @@ -1,10 +1,11 @@ #include "ParticleEmitter.h" +#include "api/Sprite.h" using namespace crepe; -ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Data & data) +ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data) : Component(game_object_id), - data(data) { + sprite(sprite), data(data) { for (size_t i = 0; i < this->data.max_particles; i++) { this->data.particles.emplace_back(); } diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index b83fd61..e8fa15e 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -1,5 +1,6 @@ #pragma once +#include <cmath> #include <vector> #include "Component.h" @@ -26,15 +27,18 @@ public: */ struct Boundary { //! boundary width (midpoint is emitter location) - double width = 0.0; + float width = INFINITY; //! boundary height (midpoint is emitter location) - double height = 0.0; + float height = INFINITY; //! boundary offset from particle emitter location vec2 offset; //! reset on exit or stop velocity and set max postion bool reset_on_exit = false; }; + //! sprite reference of displayed sprite + const Sprite & sprite; + /** * \brief Holds parameters that control particle emission. * @@ -45,29 +49,28 @@ public: //! position of the emitter vec2 position; //! maximum number of particles - const unsigned int max_particles = 0; + const unsigned int max_particles = 256; //! rate of particle emission per update (Lowest value = 0.001 any lower is ignored) - double emission_rate = 0; + float emission_rate = 1; //! min speed of the particles - double min_speed = 0; + float min_speed = 1; //! min speed of the particles - double max_speed = 0; + float max_speed = 2; //! min angle of particle emission - double min_angle = 0; + float min_angle = 0; //! max angle of particle emission - double max_angle = 0; + float max_angle = 0; //! begin Lifespan of particle (only visual) - double begin_lifespan = 0.0; + float begin_lifespan = 0.0; //! end Lifespan of particle - double end_lifespan = 0.0; + float end_lifespan = 10.0; //! force over time (physics) vec2 force_over_time; //! particle boundary Boundary boundary; //! collection of particles std::vector<Particle> particles; - //! sprite reference - const Sprite & sprite; + }; public: @@ -75,7 +78,7 @@ public: * \param game_object_id Identifier for the game object using this emitter. * \param data Configuration data defining particle properties. */ - ParticleEmitter(game_object_id_t game_object_id, const Data & data); + ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite,const Data & data); public: //! Configuration data for particle emission settings. diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index b14c52f..596b4b0 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -21,9 +21,9 @@ void ParticleSystem::update() { = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); // Emit particles based on emission_rate - int updates = calculate_update(this->update_count, emitter.data.emission_rate); + int updates = this->calculate_update(this->update_count, emitter.data.emission_rate); for (size_t i = 0; i < updates; i++) { - emit_particle(emitter, transform); + this->emit_particle(emitter, transform); } // Update all particles @@ -34,7 +34,7 @@ void ParticleSystem::update() { } // Check if within boundary - check_bounds(emitter, transform); + this->check_bounds(emitter, transform); } this->update_count = (this->update_count + 1) % this->MAX_UPDATE_COUNT; @@ -61,9 +61,9 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & } } -int ParticleSystem::calculate_update(int count, double emission) const { - double integer_part = std::floor(emission); - double fractional_part = emission - integer_part; +int ParticleSystem::calculate_update(int count, float emission) const { + float integer_part = std::floor(emission); + float fractional_part = emission - integer_part; if (fractional_part > 0) { int denominator = static_cast<int>(1.0 / fractional_part); @@ -75,13 +75,13 @@ int ParticleSystem::calculate_update(int count, double emission) const { void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) { vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position; - double half_width = emitter.data.boundary.width / 2.0; - double half_height = emitter.data.boundary.height / 2.0; + float half_width = emitter.data.boundary.width / 2.0; + float half_height = emitter.data.boundary.height / 2.0; - const double LEFT = offset.x - half_width; - const double RIGHT = offset.x + half_width; - const double TOP = offset.y - half_height; - const double BOTTOM = offset.y + half_height; + const float LEFT = offset.x - half_width; + const float RIGHT = offset.x + half_width; + const float TOP = offset.y - half_height; + const float BOTTOM = offset.y + half_height; for (Particle & particle : emitter.data.particles) { const vec2 & position = particle.position; @@ -102,25 +102,25 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t } } -double ParticleSystem::generate_random_angle(double min_angle, double max_angle) const { +float ParticleSystem::generate_random_angle(float min_angle, float max_angle) const { if (min_angle == max_angle) { return min_angle; } else if (min_angle < max_angle) { return min_angle - + static_cast<double>(std::rand() % static_cast<int>(max_angle - min_angle)); + + static_cast<float>(std::rand() % static_cast<int>(max_angle - min_angle)); } else { - double angle_offset = (360 - min_angle) + max_angle; - double random_angle - = min_angle + static_cast<double>(std::rand() % static_cast<int>(angle_offset)); + float angle_offset = (360 - min_angle) + max_angle; + float random_angle + = min_angle + static_cast<float>(std::rand() % static_cast<int>(angle_offset)); return (random_angle >= 360) ? random_angle - 360 : random_angle; } } -double ParticleSystem::generate_random_speed(double min_speed, double max_speed) const { +float ParticleSystem::generate_random_speed(float min_speed, float max_speed) const { if (min_speed == max_speed) { return min_speed; } else { return min_speed - + static_cast<double>(std::rand() % static_cast<int>(max_speed - min_speed)); + + static_cast<float>(std::rand() % static_cast<int>(max_speed - min_speed)); } } diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index 068f01c..2adb0f0 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -39,7 +39,7 @@ private: * \param emission Emission rate. * \return The number of particles to emit. */ - int calculate_update(int count, double emission) const; + int calculate_update(int count, float emission) const; /** * \brief Checks whether particles are within the emitter’s boundary, resets or stops @@ -57,7 +57,7 @@ private: * \param max_angle Maximum emission angle in degrees. * \return Random angle in degrees. */ - double generate_random_angle(double min_angle, double max_angle) const; + float generate_random_angle(float min_angle, float max_angle) const; /** * \brief Generates a random speed for particle emission within the specified range. @@ -66,7 +66,7 @@ private: * \param max_speed Maximum emission speed. * \return Random speed. */ - double generate_random_speed(double min_speed, double max_speed) const; + float generate_random_speed(float min_speed, float max_speed) const; private: //! Counter to count updates to determine how many times emit_particle is -- cgit v1.2.3 From 666292e33d6997a61d9eaff31e8180a602656474 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sat, 7 Dec 2024 20:39:19 +0100 Subject: save --- src/crepe/api/Event.h | 97 ++++--- src/crepe/api/Transform.h | 8 + src/crepe/facade/SDLContext.cpp | 134 +++++---- src/crepe/facade/SDLContext.h | 35 ++- src/crepe/system/InputSystem.cpp | 102 ++++--- src/test/EventTest.cpp | 39 ++- src/test/InputTest.cpp | 586 +++++++++++++++++++-------------------- 7 files changed, 550 insertions(+), 451 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index f2f3daf..265e925 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -4,7 +4,7 @@ #include <string> #include "KeyCodes.h" - +#include "types.h" namespace crepe { /** @@ -38,11 +38,8 @@ public: */ class MousePressEvent : public Event { public: - //! X-coordinate of the mouse position at the time of the event. - int mouse_x = 0; - - //! Y-coordinate of the mouse position at the time of the event. - int mouse_y = 0; + //! mouse position + ivec2 mouse_pos = {0,0}; //! The mouse button that was pressed. MouseButton button = MouseButton::NONE; @@ -53,11 +50,8 @@ public: */ class MouseClickEvent : public Event { public: - //! X-coordinate of the mouse position at the time of the event. - int mouse_x = 0; - - //! Y-coordinate of the mouse position at the time of the event. - int mouse_y = 0; + //! mouse position + ivec2 mouse_pos = {0,0}; //! The mouse button that was clicked. MouseButton button = MouseButton::NONE; @@ -68,11 +62,8 @@ public: */ class MouseReleaseEvent : public Event { public: - //! X-coordinate of the mouse position at the time of the event. - int mouse_x = 0; - - //! Y-coordinate of the mouse position at the time of the event. - int mouse_y = 0; + //! mouse position + ivec2 mouse_pos = {0,0}; //! The mouse button that was released. MouseButton button = MouseButton::NONE; @@ -83,17 +74,10 @@ public: */ class MouseMoveEvent : public Event { public: - //! X-coordinate of the mouse position at the time of the event. - int mouse_x = 0; - - //! Y-coordinate of the mouse position at the time of the event. - int mouse_y = 0; - - // Movement since last event in x - int delta_x = 0; - - // Movement since last event in y - int delta_y = 0; + //! new mouse position + ivec2 mouse_pos = {0,0}; + //! The change in mouse position relative to the last position (in pixels). + ivec2 mouse_delta = {0,0}; }; /** @@ -101,12 +85,8 @@ public: */ class MouseScrollEvent : public Event { public: - //! X-coordinate of the mouse position at the time of the event. - int mouse_x = 0; - - //! Y-coordinate of the mouse position at the time of the event. - int mouse_y = 0; - + //! mouse position when the scroll happened. + ivec2 mouse_pos = {0,0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; //! scroll amount in y axis (from and away from the person). @@ -127,4 +107,55 @@ public: */ class ShutDownEvent : public Event {}; +/** + * \brief Event triggered to indicate the window is overlapped by another window. + * + * When two windows overlap the bottom window gets distorted and that window has to be redrawn. + */ +class WindowExposeEvent : public Event{}; + +/** + * \brief Event triggered to indicate the window is resized. + */ +class WindowResizeEvent : public Event{ + public: + //! new window dimensions + ivec2 dimensions = {0,0}; +}; + +/** + * \brief Event triggered to indicate the window is moved. + */ +class WindowMoveEvent : public Event{ + public: + //! The change in position relative to the last position (in pixels). + ivec2 delta_move = {0,0}; +}; + +/** + * \brief Event triggered to indicate the window is minimized. + */ +class WindowMinimizeEvent : public Event{}; + +/** + * \brief Event triggered to indicate the window is maximized + */ +class WindowMaximizeEvent : public Event{}; + +/** + * \brief Event triggered to indicate the window gained focus + * + * This event is triggered when the window receives focus, meaning it becomes the active window + * for user interaction. + */ +class WindowFocusGainEvent : public Event{}; + +/** + * \brief Event triggered to indicate the window lost focus + * + * This event is triggered when the window loses focus, meaning it is no longer the active window + * for user interaction. + */ +class WindowFocusLostEvent : public Event{}; + } // namespace crepe diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h index 7ee6d65..78407ee 100644 --- a/src/crepe/api/Transform.h +++ b/src/crepe/api/Transform.h @@ -13,6 +13,14 @@ namespace crepe { */ class Transform : public Component { public: + //! Specifies the coordinate space for transformations. + enum Space { + //! coordinates are relative to the active camera + HUD, + //! coordinates are relative to the game world + WORLD, + }; + Space coordinate_space = Space::WORLD; //! Translation (shift) vec2 position = {0, 0}; //! Rotation, in degrees clockwise diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4cc2206..e3410cb 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -375,65 +375,83 @@ ivec2 SDLContext::get_size(const Texture & ctx) { void SDLContext::delay(int ms) const { SDL_Delay(ms); } std::vector<SDLContext::EventData> SDLContext::get_events() { - std::vector<SDLContext::EventData> event_list; - SDL_Event event; - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_QUIT: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::SHUTDOWN, - }); - break; - case SDL_KEYDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYDOWN, - .key = sdl_to_keycode(event.key.keysym.scancode), - .key_repeat = (event.key.repeat != 0), - }); - break; - case SDL_KEYUP: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYUP, - .key = sdl_to_keycode(event.key.keysym.scancode), - }); - break; - case SDL_MOUSEBUTTONDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEDOWN, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); - break; - case SDL_MOUSEBUTTONUP: { - int x, y; - SDL_GetMouseState(&x, &y); - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEUP, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); - } break; - - case SDL_MOUSEMOTION: { - event_list.push_back( - EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, - .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); - } break; - - case SDL_MOUSEWHEEL: { - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, - // TODO: why is this needed? - .scroll_direction = event.wheel.y < 0 ? -1 : 1, - .scroll_delta = event.wheel.preciseY, - }); - } break; - } - } - return event_list; + std::vector<SDLContext::EventData> event_list; + SDL_Event event; + + // Handle general SDL events + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: + event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); + break; + case SDL_KEYDOWN: + event_list.push_back({SDLContext::EventType::KEYDOWN, + {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, {}, {}}); + break; + case SDL_KEYUP: + event_list.push_back({SDLContext::EventType::KEYUP, + {sdl_to_keycode(event.key.keysym.scancode), false}, {}, {}}); + break; + case SDL_MOUSEBUTTONDOWN: + event_list.push_back({SDLContext::EventType::MOUSEDOWN, {}, + {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}}); + break; + case SDL_MOUSEBUTTONUP: + event_list.push_back({SDLContext::EventType::MOUSEUP, {}, + {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}}); + break; + case SDL_MOUSEMOTION: + event_list.push_back({SDLContext::EventType::MOUSEMOVE, {}, + {{}, {event.motion.x, event.motion.y}, -1, INFINITY, {event.motion.xrel, event.motion.yrel}}, {}}); + break; + case SDL_MOUSEWHEEL: + event_list.push_back({SDLContext::EventType::MOUSEWHEEL, {}, + {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, {}}); + break; + + // Forward window events for further processing + case SDL_WINDOWEVENT: + handle_window_event(event.window, event_list); + break; + } + } + + return event_list; +} + +// Separate function for SDL_WINDOWEVENT subtypes +void SDLContext::handle_window_event(const SDL_WindowEvent& window_event, + std::vector<SDLContext::EventData>& event_list) { + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, + {{}, {window_event.data1, window_event.data2}}}); + break; + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, + {{window_event.data1, window_event.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } } + + + + void SDLContext::set_color_texture(const Texture & texture, const Color & color) { SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture.texture.get(), color.a); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index e232511..1f83985 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -79,19 +79,37 @@ public: KEYUP, KEYDOWN, SHUTDOWN, - + WINDOW_MINIMIZE, + WINDOW_MAXIMIZE, + WINDOW_FOCUS_GAIN, + WINDOW_FOCUS_LOST, + WINDOW_MOVE, + WINDOW_RESIZE, + WINDOW_EXPOSE, }; - //! EventData struct for passing event data from facade - struct EventData { - SDLContext::EventType event_type = SDLContext::EventType::NONE; + struct KeyData{ Keycode key = Keycode::NONE; bool key_repeat = false; + }; + struct MouseData{ MouseButton mouse_button = MouseButton::NONE; ivec2 mouse_position = {-1, -1}; int scroll_direction = -1; float scroll_delta = INFINITY; ivec2 rel_mouse_move = {-1, -1}; }; + struct WindowData{ + ivec2 move_delta; + ivec2 resize_dimension; + }; + //! EventData struct for passing event data from facade + struct EventData { + SDLContext::EventType event_type = SDLContext::EventType::NONE; + KeyData key_data; + MouseData mouse_data; + WindowData window_data; + }; + /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -116,7 +134,14 @@ private: * \return Events that occurred since last call to `get_events()` */ std::vector<SDLContext::EventData> get_events(); - + /** + * \brief Fills event_list with triggered window events + * + * This method checks if any window events are triggered and adds them to the event_list. + * + */ + void handle_window_event(const SDL_WindowEvent& window_event, + std::vector<SDLContext::EventData>& event_list); /** * \brief Converts an SDL key code to the custom Keycode type. * diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index aaa8bdf..b7d2eb4 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -26,29 +26,31 @@ void InputSystem::update() { Transform & cam_transform = transform_vec.front().get(); int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x - (current_cam.viewport_size.x / 2); - int camera_origin_y = cam_transform.position.y + current_cam.data.postion_offset.y + int camera_origin_y = + ivec2 camera_origin; + camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y - (current_cam.viewport_size.y / 2); - + camera_origin for (const SDLContext::EventData & event : event_list) { - int world_mouse_x = event.mouse_position.x + camera_origin_x; - int world_mouse_y = event.mouse_position.y + camera_origin_y; + int adjusted_mouse_x = event.mouse_data.mouse_position.x + camera_origin_x; + int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin_y; // check if the mouse is within the viewport bool mouse_in_viewport - = !(world_mouse_x < camera_origin_x - || world_mouse_x > camera_origin_x + current_cam.viewport_size.x - || world_mouse_y < camera_origin_y - || world_mouse_y > camera_origin_y + current_cam.viewport_size.y); + = !(adjusted_mouse_x < camera_origin_x + || adjusted_mouse_x > camera_origin_x + current_cam.viewport_size.x + || adjusted_mouse_y < camera_origin_y + || adjusted_mouse_y > camera_origin_y + current_cam.viewport_size.y); switch (event.event_type) { case SDLContext::EventType::KEYDOWN: event_mgr.queue_event<KeyPressEvent>(KeyPressEvent{ - .repeat = event.key_repeat, - .key = event.key, + .repeat = event.key_data.key_repeat, + .key = event.key_data.key, }); break; case SDLContext::EventType::KEYUP: event_mgr.queue_event<KeyReleaseEvent>(KeyReleaseEvent{ - .key = event.key, + .key = event.key_data.key, }); break; case SDLContext::EventType::MOUSEDOWN: @@ -56,36 +58,32 @@ void InputSystem::update() { break; } event_mgr.queue_event<MousePressEvent>(MousePressEvent{ - .mouse_x = world_mouse_x, - .mouse_y = world_mouse_y, - .button = event.mouse_button, + .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, }); - this->last_mouse_down_position = {world_mouse_x, world_mouse_y}; - this->last_mouse_button = event.mouse_button; + this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y}; + this->last_mouse_button = event.mouse_data.mouse_button; break; case SDLContext::EventType::MOUSEUP: { if (!mouse_in_viewport) { break; } event_mgr.queue_event<MouseReleaseEvent>(MouseReleaseEvent{ - .mouse_x = world_mouse_x, - .mouse_y = world_mouse_y, - .button = event.mouse_button, + .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, }); - //check if its a click by checking the last button down - int delta_x = world_mouse_x - this->last_mouse_down_position.x; - int delta_y = world_mouse_y - this->last_mouse_down_position.y; + int delta_x = adjusted_mouse_x - this->last_mouse_down_position.x; + int delta_y = adjusted_mouse_y - this->last_mouse_down_position.y; - if (this->last_mouse_button == event.mouse_button + if (this->last_mouse_button == event.mouse_data.mouse_button && std::abs(delta_x) <= click_tolerance && std::abs(delta_y) <= click_tolerance) { event_mgr.queue_event<MouseClickEvent>(MouseClickEvent{ - .mouse_x = world_mouse_x, - .mouse_y = world_mouse_y, - .button = event.mouse_button, + .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, }); - this->handle_click(event.mouse_button, world_mouse_x, world_mouse_y); + this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y); } } break; case SDLContext::EventType::MOUSEMOVE: @@ -93,31 +91,53 @@ void InputSystem::update() { break; } event_mgr.queue_event<MouseMoveEvent>(MouseMoveEvent{ - .mouse_x = world_mouse_x, - .mouse_y = world_mouse_y, - .delta_x = event.rel_mouse_move.x, - .delta_y = event.rel_mouse_move.y, + .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, + .mouse_delta = event.mouse_data.rel_mouse_move, }); - this->handle_move(event, world_mouse_x, world_mouse_y); + this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y); break; case SDLContext::EventType::MOUSEWHEEL: event_mgr.queue_event<MouseScrollEvent>(MouseScrollEvent{ - .mouse_x = world_mouse_x, - .mouse_y = world_mouse_y, - .scroll_direction = event.scroll_direction, - .scroll_delta = event.scroll_delta, + .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, + .scroll_direction = event.mouse_data.scroll_direction, + .scroll_delta = event.mouse_data.scroll_delta, }); break; case SDLContext::EventType::SHUTDOWN: event_mgr.queue_event<ShutDownEvent>(ShutDownEvent{}); break; + case SDLContext::EventType::WINDOW_EXPOSE: + event_mgr.queue_event<WindowExposeEvent>(WindowExposeEvent{}); + break; + case SDLContext::EventType::WINDOW_RESIZE: + event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{ + .dimensions = event.window_data.resize_dimension, + }); + break; + case SDLContext::EventType::WINDOW_MOVE: + event_mgr.queue_event<WindowMoveEvent>(WindowMoveEvent{ + .delta_move = event.window_data.move_delta, + }); + break; + case SDLContext::EventType::WINDOW_MINIMIZE: + event_mgr.queue_event<WindowMinimizeEvent>(WindowMinimizeEvent{}); + break; + case SDLContext::EventType::WINDOW_MAXIMIZE: + event_mgr.queue_event<WindowMaximizeEvent>(WindowMaximizeEvent{}); + break; + case SDLContext::EventType::WINDOW_FOCUS_GAIN: + event_mgr.queue_event<WindowFocusGainEvent>(WindowFocusGainEvent{}); + break; + case SDLContext::EventType::WINDOW_FOCUS_LOST: + event_mgr.queue_event<WindowFocusLostEvent>(WindowFocusLostEvent{}); + break; default: break; } } } void InputSystem::handle_move(const SDLContext::EventData & event_data, - const int world_mouse_x, const int world_mouse_y) { + const int adjusted_mouse_x, const int adjusted_mouse_y) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -129,7 +149,7 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, bool was_hovering = button.hover; if (button.active - && this->is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) { + && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) { button.hover = true; if (!was_hovering && button.on_mouse_enter) { button.on_mouse_enter(); @@ -144,8 +164,8 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, } } -void InputSystem::handle_click(const MouseButton & mouse_button, const int world_mouse_x, - const int world_mouse_y) { +void InputSystem::handle_click(const MouseButton & mouse_button, const int adjusted_mouse_x, + const int adjusted_mouse_y) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -156,7 +176,7 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const int world Transform & transform = transform_vec.front().get(); if (button.active - && this->is_mouse_inside_button(world_mouse_x, world_mouse_y, button, transform)) { + && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) { this->handle_button_press(button); } } diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp index 4a4872d..53c2469 100644 --- a/src/test/EventTest.cpp +++ b/src/test/EventTest.cpp @@ -63,16 +63,15 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) { EventHandler<MouseClickEvent> mouse_handler = [&](const MouseClickEvent & e) { triggered = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; }; EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL); - MouseClickEvent click_event{ - .mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); @@ -83,15 +82,14 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) { int test_channel = 1; EventHandler<MouseClickEvent> mouse_handler = [&](const MouseClickEvent & e) { triggered = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; }; EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, test_channel); - MouseClickEvent click_event{ - .mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); @@ -109,23 +107,22 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) { // Handlers EventHandler<MouseClickEvent> mouse_handler_true = [&](const MouseClickEvent & e) { triggered_true = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return true; // Stops propagation }; EventHandler<MouseClickEvent> mouse_handler_false = [&](const MouseClickEvent & e) { triggered_false = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; // Allows propagation }; // Test event - MouseClickEvent click_event{ - .mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL); event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL); @@ -201,16 +198,16 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Define EventHandlers EventHandler<MouseClickEvent> mouse_handler1 = [&](const MouseClickEvent & e) { triggered1 = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; // Allows propagation }; EventHandler<MouseClickEvent> mouse_handler2 = [&](const MouseClickEvent & e) { triggered2 = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; // Allows propagation }; @@ -220,7 +217,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue events event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - both handlers should be triggered event_manager.dispatch_events(); @@ -236,7 +233,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue the same event again event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - only handler 2 should be triggered, handler 1 should NOT event_manager.dispatch_events(); @@ -251,7 +248,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue the event again event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - no handler should be triggered event_manager.dispatch_events(); diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index a7c0157..0b48d5b 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -1,293 +1,293 @@ -#include <gtest/gtest.h> -#define protected public -#define private public -#include "api/KeyCodes.h" -#include "manager/ComponentManager.h" -#include "manager/EventManager.h" -#include "manager/Mediator.h" -#include "system/InputSystem.h" -#include <SDL2/SDL.h> -#include <SDL2/SDL_keycode.h> -#include <crepe/api/Button.h> -#include <crepe/api/Camera.h> -#include <crepe/api/GameObject.h> -#include <crepe/api/Metadata.h> -#include <crepe/api/Transform.h> -#include <crepe/api/Vector2.h> -#include <gmock/gmock.h> - -using namespace std; -using namespace std::chrono_literals; -using namespace crepe; - -class InputTest : public ::testing::Test { -public: - Mediator mediator; - ComponentManager mgr{mediator}; - - InputSystem input_system{mediator}; - - EventManager & event_manager = EventManager::get_instance(); - //GameObject camera; - -protected: - void SetUp() override { - mediator.event_manager = event_manager; - mediator.component_manager = mgr; - event_manager.clear(); - } - - void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { - SDL_Event event; - - // Simulate Mouse Button Down event - SDL_zero(event); - event.type = SDL_MOUSEBUTTONDOWN; - event.button.x = mouse_x; - event.button.y = mouse_y; - event.button.button = mouse_button; - SDL_PushEvent(&event); - - // Simulate Mouse Button Up event - SDL_zero(event); - event.type = SDL_MOUSEBUTTONUP; - event.button.x = mouse_x; - event.button.y = mouse_y; - event.button.button = mouse_button; - SDL_PushEvent(&event); - } -}; - -TEST_F(InputTest, MouseDown) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool mouse_triggered = false; - EventHandler<MousePressEvent> on_mouse_down = [&](const MousePressEvent & event) { - mouse_triggered = true; - //middle of the screen = 0,0 - EXPECT_EQ(event.mouse_x, 0); - EXPECT_EQ(event.mouse_y, 0); - EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE); - return false; - }; - event_manager.subscribe<MousePressEvent>(on_mouse_down); - - SDL_Event event; - SDL_zero(event); - event.type = SDL_MOUSEBUTTONDOWN; - // middle of the screen of a 500*500 camera = 250*250 - event.button.x = 250; - event.button.y = 250; - event.button.button = SDL_BUTTON_LEFT; - SDL_PushEvent(&event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(mouse_triggered); -} - -TEST_F(InputTest, MouseUp) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool function_triggered = false; - EventHandler<MouseReleaseEvent> on_mouse_release = [&](const MouseReleaseEvent & e) { - function_triggered = true; - EXPECT_EQ(e.mouse_x, 0); - EXPECT_EQ(e.mouse_y, 0); - EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); - return false; - }; - event_manager.subscribe<MouseReleaseEvent>(on_mouse_release); - - SDL_Event event; - SDL_zero(event); - event.type = SDL_MOUSEBUTTONUP; - event.button.x = 250; - event.button.y = 250; - event.button.button = SDL_BUTTON_LEFT; - SDL_PushEvent(&event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(function_triggered); -} - -TEST_F(InputTest, MouseMove) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool function_triggered = false; - EventHandler<MouseMoveEvent> on_mouse_move = [&](const MouseMoveEvent & e) { - function_triggered = true; - EXPECT_EQ(e.mouse_x, 0); - EXPECT_EQ(e.mouse_y, 0); - EXPECT_EQ(e.delta_x, 10); - EXPECT_EQ(e.delta_y, 10); - return false; - }; - event_manager.subscribe<MouseMoveEvent>(on_mouse_move); - - SDL_Event event; - SDL_zero(event); - event.type = SDL_MOUSEMOTION; - event.motion.x = 250; - event.motion.y = 250; - event.motion.xrel = 10; - event.motion.yrel = 10; - SDL_PushEvent(&event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(function_triggered); -} - -TEST_F(InputTest, KeyDown) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool function_triggered = false; - - // Define event handler for KeyPressEvent - EventHandler<KeyPressEvent> on_key_press = [&](const KeyPressEvent & event) { - function_triggered = true; - EXPECT_EQ(event.key, Keycode::B); // Validate the key is 'B' - EXPECT_EQ(event.repeat, true); // Validate repeat flag - return false; - }; - - event_manager.subscribe<KeyPressEvent>(on_key_press); - - // Simulate SDL_KEYDOWN event - SDL_Event test_event; - SDL_zero(test_event); - test_event.type = SDL_KEYDOWN; // Key down event - test_event.key.keysym.scancode = SDL_SCANCODE_B; // Set scancode for 'B' - test_event.key.repeat = 1; // Set repeat flag - SDL_PushEvent(&test_event); - - input_system.update(); // Process the event - event_manager.dispatch_events(); // Dispatch events to handlers - - EXPECT_TRUE(function_triggered); // Check if the handler was triggered -} - -TEST_F(InputTest, KeyUp) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool function_triggered = false; - EventHandler<KeyReleaseEvent> on_key_release = [&](const KeyReleaseEvent & event) { - function_triggered = true; - EXPECT_EQ(event.key, Keycode::B); - return false; - }; - event_manager.subscribe<KeyReleaseEvent>(on_key_release); - - SDL_Event event; - SDL_zero(event); - event.type = SDL_KEYUP; - event.key.keysym.scancode = SDL_SCANCODE_B; - SDL_PushEvent(&event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(function_triggered); -} - -TEST_F(InputTest, MouseClick) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool on_click_triggered = false; - EventHandler<MouseClickEvent> on_mouse_click = [&](const MouseClickEvent & event) { - on_click_triggered = true; - EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE); - EXPECT_EQ(event.mouse_x, 0); - EXPECT_EQ(event.mouse_y, 0); - return false; - }; - event_manager.subscribe<MouseClickEvent>(on_mouse_click); - - this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(on_click_triggered); -} - -TEST_F(InputTest, testButtonClick) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); - bool button_clicked = false; - std::function<void()> on_click = [&]() { button_clicked = true; }; - auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); - - bool hover = false; - button.active = true; - - button.is_pressed = false; - button.is_toggle = false; - this->simulate_mouse_click(999, 999, SDL_BUTTON_LEFT); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_FALSE(button_clicked); - - this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(button_clicked); -} - -TEST_F(InputTest, testButtonHover) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); - bool button_clicked = false; - std::function<void()> on_click = [&]() { button_clicked = true; }; - auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); - button.active = true; - button.is_pressed = false; - button.is_toggle = false; - - // Mouse not on button - SDL_Event event; - SDL_zero(event); - event.type = SDL_MOUSEMOTION; - event.motion.x = 700; - event.motion.y = 700; - event.motion.xrel = 10; - event.motion.yrel = 10; - SDL_PushEvent(&event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_FALSE(button.hover); - - // Mouse on button - SDL_Event hover_event; - SDL_zero(hover_event); - hover_event.type = SDL_MOUSEMOTION; - hover_event.motion.x = 250; - hover_event.motion.y = 250; - hover_event.motion.xrel = 10; - hover_event.motion.yrel = 10; - SDL_PushEvent(&hover_event); - - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(button.hover); -} +// #include <gtest/gtest.h> +// #define protected public +// #define private public +// #include "api/KeyCodes.h" +// #include "manager/ComponentManager.h" +// #include "manager/EventManager.h" +// #include "manager/Mediator.h" +// #include "system/InputSystem.h" +// #include <SDL2/SDL.h> +// #include <SDL2/SDL_keycode.h> +// #include <crepe/api/Button.h> +// #include <crepe/api/Camera.h> +// #include <crepe/api/GameObject.h> +// #include <crepe/api/Metadata.h> +// #include <crepe/api/Transform.h> +// #include <crepe/api/Vector2.h> +// #include <gmock/gmock.h> + +// using namespace std; +// using namespace std::chrono_literals; +// using namespace crepe; + +// class InputTest : public ::testing::Test { +// public: +// Mediator mediator; +// ComponentManager mgr{mediator}; + +// InputSystem input_system{mediator}; + +// EventManager & event_manager = EventManager::get_instance(); +// //GameObject camera; + +// protected: +// void SetUp() override { +// mediator.event_manager = event_manager; +// mediator.component_manager = mgr; +// event_manager.clear(); +// } + +// void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { +// SDL_Event event; + +// // Simulate Mouse Button Down event +// SDL_zero(event); +// event.type = SDL_MOUSEBUTTONDOWN; +// event.button.x = mouse_x; +// event.button.y = mouse_y; +// event.button.button = mouse_button; +// SDL_PushEvent(&event); + +// // Simulate Mouse Button Up event +// SDL_zero(event); +// event.type = SDL_MOUSEBUTTONUP; +// event.button.x = mouse_x; +// event.button.y = mouse_y; +// event.button.button = mouse_button; +// SDL_PushEvent(&event); +// } +// }; + +// TEST_F(InputTest, MouseDown) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool mouse_triggered = false; +// EventHandler<MousePressEvent> on_mouse_down = [&](const MousePressEvent & event) { +// mouse_triggered = true; +// //middle of the screen = 0,0 +// EXPECT_EQ(event.mouse_x, 0); +// EXPECT_EQ(event.mouse_y, 0); +// EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE); +// return false; +// }; +// event_manager.subscribe<MousePressEvent>(on_mouse_down); + +// SDL_Event event; +// SDL_zero(event); +// event.type = SDL_MOUSEBUTTONDOWN; +// // middle of the screen of a 500*500 camera = 250*250 +// event.button.x = 250; +// event.button.y = 250; +// event.button.button = SDL_BUTTON_LEFT; +// SDL_PushEvent(&event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(mouse_triggered); +// } + +// TEST_F(InputTest, MouseUp) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool function_triggered = false; +// EventHandler<MouseReleaseEvent> on_mouse_release = [&](const MouseReleaseEvent & e) { +// function_triggered = true; +// EXPECT_EQ(e.mouse_x, 0); +// EXPECT_EQ(e.mouse_y, 0); +// EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); +// return false; +// }; +// event_manager.subscribe<MouseReleaseEvent>(on_mouse_release); + +// SDL_Event event; +// SDL_zero(event); +// event.type = SDL_MOUSEBUTTONUP; +// event.button.x = 250; +// event.button.y = 250; +// event.button.button = SDL_BUTTON_LEFT; +// SDL_PushEvent(&event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(function_triggered); +// } + +// TEST_F(InputTest, MouseMove) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool function_triggered = false; +// EventHandler<MouseMoveEvent> on_mouse_move = [&](const MouseMoveEvent & e) { +// function_triggered = true; +// EXPECT_EQ(e.mouse_x, 0); +// EXPECT_EQ(e.mouse_y, 0); +// EXPECT_EQ(e.delta_x, 10); +// EXPECT_EQ(e.delta_y, 10); +// return false; +// }; +// event_manager.subscribe<MouseMoveEvent>(on_mouse_move); + +// SDL_Event event; +// SDL_zero(event); +// event.type = SDL_MOUSEMOTION; +// event.motion.x = 250; +// event.motion.y = 250; +// event.motion.xrel = 10; +// event.motion.yrel = 10; +// SDL_PushEvent(&event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(function_triggered); +// } + +// TEST_F(InputTest, KeyDown) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool function_triggered = false; + +// // Define event handler for KeyPressEvent +// EventHandler<KeyPressEvent> on_key_press = [&](const KeyPressEvent & event) { +// function_triggered = true; +// EXPECT_EQ(event.key, Keycode::B); // Validate the key is 'B' +// EXPECT_EQ(event.repeat, true); // Validate repeat flag +// return false; +// }; + +// event_manager.subscribe<KeyPressEvent>(on_key_press); + +// // Simulate SDL_KEYDOWN event +// SDL_Event test_event; +// SDL_zero(test_event); +// test_event.type = SDL_KEYDOWN; // Key down event +// test_event.key.keysym.scancode = SDL_SCANCODE_B; // Set scancode for 'B' +// test_event.key.repeat = 1; // Set repeat flag +// SDL_PushEvent(&test_event); + +// input_system.update(); // Process the event +// event_manager.dispatch_events(); // Dispatch events to handlers + +// EXPECT_TRUE(function_triggered); // Check if the handler was triggered +// } + +// TEST_F(InputTest, KeyUp) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool function_triggered = false; +// EventHandler<KeyReleaseEvent> on_key_release = [&](const KeyReleaseEvent & event) { +// function_triggered = true; +// EXPECT_EQ(event.key, Keycode::B); +// return false; +// }; +// event_manager.subscribe<KeyReleaseEvent>(on_key_release); + +// SDL_Event event; +// SDL_zero(event); +// event.type = SDL_KEYUP; +// event.key.keysym.scancode = SDL_SCANCODE_B; +// SDL_PushEvent(&event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(function_triggered); +// } + +// TEST_F(InputTest, MouseClick) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// bool on_click_triggered = false; +// EventHandler<MouseClickEvent> on_mouse_click = [&](const MouseClickEvent & event) { +// on_click_triggered = true; +// EXPECT_EQ(event.button, MouseButton::LEFT_MOUSE); +// EXPECT_EQ(event.mouse_x, 0); +// EXPECT_EQ(event.mouse_y, 0); +// return false; +// }; +// event_manager.subscribe<MouseClickEvent>(on_mouse_click); + +// this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT); +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(on_click_triggered); +// } + +// TEST_F(InputTest, testButtonClick) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); +// bool button_clicked = false; +// std::function<void()> on_click = [&]() { button_clicked = true; }; +// auto & button +// = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); + +// bool hover = false; +// button.active = true; + +// button.is_pressed = false; +// button.is_toggle = false; +// this->simulate_mouse_click(999, 999, SDL_BUTTON_LEFT); +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_FALSE(button_clicked); + +// this->simulate_mouse_click(250, 250, SDL_BUTTON_LEFT); +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(button_clicked); +// } + +// TEST_F(InputTest, testButtonHover) { +// GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +// auto & camera = obj.add_component<Camera>( +// ivec2{100, 100}, vec2{100, 100}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +// camera.active = true; +// GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); +// bool button_clicked = false; +// std::function<void()> on_click = [&]() { button_clicked = true; }; +// auto & button +// = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); +// button.active = true; +// button.is_pressed = false; +// button.is_toggle = false; + +// // Mouse not on button +// SDL_Event event; +// SDL_zero(event); +// event.type = SDL_MOUSEMOTION; +// event.motion.x = 700; +// event.motion.y = 700; +// event.motion.xrel = 10; +// event.motion.yrel = 10; +// SDL_PushEvent(&event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_FALSE(button.hover); + +// // Mouse on button +// SDL_Event hover_event; +// SDL_zero(hover_event); +// hover_event.type = SDL_MOUSEMOTION; +// hover_event.motion.x = 250; +// hover_event.motion.y = 250; +// hover_event.motion.xrel = 10; +// hover_event.motion.yrel = 10; +// SDL_PushEvent(&hover_event); + +// input_system.update(); +// event_manager.dispatch_events(); +// EXPECT_TRUE(button.hover); +// } -- cgit v1.2.3 From 8c81bf4a33a13fc21dca7e3fe78a6dc334ac964b Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 7 Dec 2024 22:44:35 +0100 Subject: changed spawnrate of particles (bound to delta time) --- src/crepe/Particle.cpp | 9 +++++---- src/crepe/Particle.h | 7 ++++--- src/crepe/api/ParticleEmitter.h | 2 ++ src/crepe/system/ParticleSystem.cpp | 26 +++++++++----------------- src/crepe/system/ParticleSystem.h | 11 +---------- 5 files changed, 21 insertions(+), 34 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp index ce000a1..b340826 100644 --- a/src/crepe/Particle.cpp +++ b/src/crepe/Particle.cpp @@ -15,16 +15,17 @@ void Particle::reset(unsigned int lifespan, const vec2 & position, const vec2 & this->force_over_time = {0, 0}; } -void Particle::update() { +void Particle::update(double dt) { // Deactivate particle if it has exceeded its lifespan - if (++time_in_life >= lifespan) { + time_in_life += dt; + if (time_in_life >= lifespan) { this->active = false; return; } // Update velocity based on accumulated force and update position - this->velocity += force_over_time; - this->position += velocity; + this->velocity += force_over_time * dt; + this->position += velocity * dt; } void Particle::stop_movement() { diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index 4fa93a1..49fec1f 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -24,11 +24,11 @@ public: //! Accumulated force affecting the particle over time. vec2 force_over_time; //! Total lifespan of the particle in milliseconds. - unsigned int lifespan; + float lifespan; //! Active state of the particle; true if it is in use, false otherwise. bool active = false; //! The time the particle has been alive, in milliseconds. - unsigned int time_in_life = 0; + float time_in_life = 0; //! The angle at which the particle is oriented or moving. float angle = 0; @@ -49,8 +49,9 @@ public: * * Advances the particle's position based on its velocity and applies accumulated forces. * Deactivates the particle if its lifespan has expired. + * \param dt The amount of fixed delta time that has passed. */ - void update(); + void update(double dt); /** * \brief Stops the particle's movement. * diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index e8fa15e..48c7625 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -52,6 +52,8 @@ public: const unsigned int max_particles = 256; //! rate of particle emission per update (Lowest value = 0.001 any lower is ignored) float emission_rate = 1; + //! Saves time left over from last update event. + float spawn_accumulator = 0; //! min speed of the particles float min_speed = 1; //! min speed of the particles diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 596b4b0..db4bcaf 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -12,8 +12,10 @@ using namespace crepe; void ParticleSystem::update() { // Get all emitters + ComponentManager & mgr = this->mediator.component_manager; RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>(); + double dt = LoopTimer::get_instance().get_fixed_delta_time(); for (ParticleEmitter & emitter : emitters) { // Get transform linked to emitter @@ -21,15 +23,17 @@ void ParticleSystem::update() { = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); // Emit particles based on emission_rate - int updates = this->calculate_update(this->update_count, emitter.data.emission_rate); - for (size_t i = 0; i < updates; i++) { - this->emit_particle(emitter, transform); - } + int spawn_amount = emitter.data.emission_rate * dt; + while (emitter.data.spawn_accumulator >= 1.0) { + emit_particle(emitter, transform); + emitter.data.spawn_accumulator -= 1.0; + } + // Update all particles for (Particle & particle : emitter.data.particles) { if (particle.active) { - particle.update(); + particle.update(dt); } } @@ -61,18 +65,6 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & } } -int ParticleSystem::calculate_update(int count, float emission) const { - float integer_part = std::floor(emission); - float fractional_part = emission - integer_part; - - if (fractional_part > 0) { - int denominator = static_cast<int>(1.0 / fractional_part); - return (count % denominator == 0) ? 1 : 0; - } - - return static_cast<int>(emission); -} - void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) { vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position; float half_width = emitter.data.boundary.width / 2.0; diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index 2adb0f0..454b65f 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -23,6 +23,7 @@ public: void update() override; private: + /** * \brief Emits a particle from the specified emitter based on its emission properties. * @@ -31,16 +32,6 @@ private: */ void emit_particle(ParticleEmitter & emitter, const Transform & transform); - /** - * \brief Calculates the number of times particles should be emitted based on emission rate - * and update count. - * - * \param count Current update count. - * \param emission Emission rate. - * \return The number of particles to emit. - */ - int calculate_update(int count, float emission) const; - /** * \brief Checks whether particles are within the emitter’s boundary, resets or stops * particles if they exit. -- cgit v1.2.3 From dd7d5cf6b01b8a6a4238b66c27861ee76522067e Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 7 Dec 2024 22:48:05 +0100 Subject: added this --- src/crepe/system/ParticleSystem.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index db4bcaf..3befb03 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -23,13 +23,12 @@ void ParticleSystem::update() { = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); // Emit particles based on emission_rate - int spawn_amount = emitter.data.emission_rate * dt; + emitter.data.spawn_accumulator = emitter.data.emission_rate * dt; while (emitter.data.spawn_accumulator >= 1.0) { - emit_particle(emitter, transform); + this->emit_particle(emitter, transform); emitter.data.spawn_accumulator -= 1.0; } - // Update all particles for (Particle & particle : emitter.data.particles) { if (particle.active) { @@ -48,9 +47,9 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & constexpr float DEG_TO_RAD = M_PI / 180.0; vec2 initial_position = emitter.data.position + transform.position; - float random_angle = generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); + float random_angle = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); - float random_speed = generate_random_speed(emitter.data.min_speed, emitter.data.max_speed); + float random_speed = this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed); float angle_radians = random_angle * DEG_TO_RAD; vec2 velocity @@ -79,7 +78,6 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t const vec2 & position = particle.position; bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP && position.y <= BOTTOM); - if (!within_bounds) { if (emitter.data.boundary.reset_on_exit) { particle.active = false; -- cgit v1.2.3 From e3318b7e0e075567a6a9e29239e074f4e02fc595 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 11:41:16 +0100 Subject: made getKeyboardState --- src/crepe/api/KeyCodes.h | 2 + src/crepe/facade/SDLContext.cpp | 237 +++++++++++++++++++++------------------ src/crepe/facade/SDLContext.h | 3 +- src/crepe/system/InputSystem.cpp | 203 +++++++++++++++++---------------- 4 files changed, 235 insertions(+), 210 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index fcfc080..6204cf2 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -150,5 +150,7 @@ enum class Keycode { RIGHT_SUPER = 347, /// \} MENU = 348, //!< Menu key. + //! Not actually a key instead its the amount of keycodes there are for array indexing + NUM_KEYCODES = 113, }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index e3410cb..9e10803 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -77,118 +77,135 @@ SDLContext::~SDLContext() { SDL_Quit(); } -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); - - table[SDL_SCANCODE_SPACE] = Keycode::SPACE; - table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; - table[SDL_SCANCODE_COMMA] = Keycode::COMMA; - table[SDL_SCANCODE_MINUS] = Keycode::MINUS; - table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD; - table[SDL_SCANCODE_SLASH] = Keycode::SLASH; - table[SDL_SCANCODE_0] = Keycode::D0; - table[SDL_SCANCODE_1] = Keycode::D1; - table[SDL_SCANCODE_2] = Keycode::D2; - table[SDL_SCANCODE_3] = Keycode::D3; - table[SDL_SCANCODE_4] = Keycode::D4; - table[SDL_SCANCODE_5] = Keycode::D5; - table[SDL_SCANCODE_6] = Keycode::D6; - table[SDL_SCANCODE_7] = Keycode::D7; - table[SDL_SCANCODE_8] = Keycode::D8; - table[SDL_SCANCODE_9] = Keycode::D9; - table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON; - table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL; - table[SDL_SCANCODE_A] = Keycode::A; - table[SDL_SCANCODE_B] = Keycode::B; - table[SDL_SCANCODE_C] = Keycode::C; - table[SDL_SCANCODE_D] = Keycode::D; - table[SDL_SCANCODE_E] = Keycode::E; - table[SDL_SCANCODE_F] = Keycode::F; - table[SDL_SCANCODE_G] = Keycode::G; - table[SDL_SCANCODE_H] = Keycode::H; - table[SDL_SCANCODE_I] = Keycode::I; - table[SDL_SCANCODE_J] = Keycode::J; - table[SDL_SCANCODE_K] = Keycode::K; - table[SDL_SCANCODE_L] = Keycode::L; - table[SDL_SCANCODE_M] = Keycode::M; - table[SDL_SCANCODE_N] = Keycode::N; - table[SDL_SCANCODE_O] = Keycode::O; - table[SDL_SCANCODE_P] = Keycode::P; - table[SDL_SCANCODE_Q] = Keycode::Q; - table[SDL_SCANCODE_R] = Keycode::R; - table[SDL_SCANCODE_S] = Keycode::S; - table[SDL_SCANCODE_T] = Keycode::T; - table[SDL_SCANCODE_U] = Keycode::U; - table[SDL_SCANCODE_V] = Keycode::V; - table[SDL_SCANCODE_W] = Keycode::W; - table[SDL_SCANCODE_X] = Keycode::X; - table[SDL_SCANCODE_Y] = Keycode::Y; - table[SDL_SCANCODE_Z] = Keycode::Z; - table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET; - table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH; - table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET; - table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT; - table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE; - table[SDL_SCANCODE_RETURN] = Keycode::ENTER; - table[SDL_SCANCODE_TAB] = Keycode::TAB; - table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE; - table[SDL_SCANCODE_INSERT] = Keycode::INSERT; - table[SDL_SCANCODE_DELETE] = Keycode::DELETE; - table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT; - table[SDL_SCANCODE_LEFT] = Keycode::LEFT; - table[SDL_SCANCODE_DOWN] = Keycode::DOWN; - table[SDL_SCANCODE_UP] = Keycode::UP; - table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP; - table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN; - table[SDL_SCANCODE_HOME] = Keycode::HOME; - table[SDL_SCANCODE_END] = Keycode::END; - table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK; - table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK; - table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK; - table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN; - table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE; - table[SDL_SCANCODE_F1] = Keycode::F1; - table[SDL_SCANCODE_F2] = Keycode::F2; - table[SDL_SCANCODE_F3] = Keycode::F3; - table[SDL_SCANCODE_F4] = Keycode::F4; - table[SDL_SCANCODE_F5] = Keycode::F5; - table[SDL_SCANCODE_F6] = Keycode::F6; - table[SDL_SCANCODE_F7] = Keycode::F7; - table[SDL_SCANCODE_F8] = Keycode::F8; - table[SDL_SCANCODE_F9] = Keycode::F9; - table[SDL_SCANCODE_F10] = Keycode::F10; - table[SDL_SCANCODE_F11] = Keycode::F11; - table[SDL_SCANCODE_F12] = Keycode::F12; - table[SDL_SCANCODE_KP_0] = Keycode::KP0; - table[SDL_SCANCODE_KP_1] = Keycode::KP1; - table[SDL_SCANCODE_KP_2] = Keycode::KP2; - table[SDL_SCANCODE_KP_3] = Keycode::KP3; - table[SDL_SCANCODE_KP_4] = Keycode::KP4; - table[SDL_SCANCODE_KP_5] = Keycode::KP5; - table[SDL_SCANCODE_KP_6] = Keycode::KP6; - table[SDL_SCANCODE_KP_7] = Keycode::KP7; - table[SDL_SCANCODE_KP_8] = Keycode::KP8; - table[SDL_SCANCODE_KP_9] = Keycode::KP9; - table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT; - table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL; - table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT; - table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER; - table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT; - table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL; - table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT; - table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER; - table[SDL_SCANCODE_MENU] = Keycode::MENU; - - return table; - }(); +static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() { + static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] { + std::array<Keycode, SDL_NUM_SCANCODES> table{}; + table.fill(Keycode::NONE); + + // Map all SDL scancodes to Keycodes + table[SDL_SCANCODE_SPACE] = Keycode::SPACE; + table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; + table[SDL_SCANCODE_COMMA] = Keycode::COMMA; + table[SDL_SCANCODE_MINUS] = Keycode::MINUS; + table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD; + table[SDL_SCANCODE_SLASH] = Keycode::SLASH; + table[SDL_SCANCODE_0] = Keycode::D0; + table[SDL_SCANCODE_1] = Keycode::D1; + table[SDL_SCANCODE_2] = Keycode::D2; + table[SDL_SCANCODE_3] = Keycode::D3; + table[SDL_SCANCODE_4] = Keycode::D4; + table[SDL_SCANCODE_5] = Keycode::D5; + table[SDL_SCANCODE_6] = Keycode::D6; + table[SDL_SCANCODE_7] = Keycode::D7; + table[SDL_SCANCODE_8] = Keycode::D8; + table[SDL_SCANCODE_9] = Keycode::D9; + table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON; + table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL; + table[SDL_SCANCODE_A] = Keycode::A; + table[SDL_SCANCODE_B] = Keycode::B; + table[SDL_SCANCODE_C] = Keycode::C; + table[SDL_SCANCODE_D] = Keycode::D; + table[SDL_SCANCODE_E] = Keycode::E; + table[SDL_SCANCODE_F] = Keycode::F; + table[SDL_SCANCODE_G] = Keycode::G; + table[SDL_SCANCODE_H] = Keycode::H; + table[SDL_SCANCODE_I] = Keycode::I; + table[SDL_SCANCODE_J] = Keycode::J; + table[SDL_SCANCODE_K] = Keycode::K; + table[SDL_SCANCODE_L] = Keycode::L; + table[SDL_SCANCODE_M] = Keycode::M; + table[SDL_SCANCODE_N] = Keycode::N; + table[SDL_SCANCODE_O] = Keycode::O; + table[SDL_SCANCODE_P] = Keycode::P; + table[SDL_SCANCODE_Q] = Keycode::Q; + table[SDL_SCANCODE_R] = Keycode::R; + table[SDL_SCANCODE_S] = Keycode::S; + table[SDL_SCANCODE_T] = Keycode::T; + table[SDL_SCANCODE_U] = Keycode::U; + table[SDL_SCANCODE_V] = Keycode::V; + table[SDL_SCANCODE_W] = Keycode::W; + table[SDL_SCANCODE_X] = Keycode::X; + table[SDL_SCANCODE_Y] = Keycode::Y; + table[SDL_SCANCODE_Z] = Keycode::Z; + table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET; + table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH; + table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET; + table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT; + table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE; + table[SDL_SCANCODE_RETURN] = Keycode::ENTER; + table[SDL_SCANCODE_TAB] = Keycode::TAB; + table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE; + table[SDL_SCANCODE_INSERT] = Keycode::INSERT; + table[SDL_SCANCODE_DELETE] = Keycode::DELETE; + table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT; + table[SDL_SCANCODE_LEFT] = Keycode::LEFT; + table[SDL_SCANCODE_DOWN] = Keycode::DOWN; + table[SDL_SCANCODE_UP] = Keycode::UP; + table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP; + table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN; + table[SDL_SCANCODE_HOME] = Keycode::HOME; + table[SDL_SCANCODE_END] = Keycode::END; + table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK; + table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK; + table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK; + table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN; + table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE; + table[SDL_SCANCODE_F1] = Keycode::F1; + table[SDL_SCANCODE_F2] = Keycode::F2; + table[SDL_SCANCODE_F3] = Keycode::F3; + table[SDL_SCANCODE_F4] = Keycode::F4; + table[SDL_SCANCODE_F5] = Keycode::F5; + table[SDL_SCANCODE_F6] = Keycode::F6; + table[SDL_SCANCODE_F7] = Keycode::F7; + table[SDL_SCANCODE_F8] = Keycode::F8; + table[SDL_SCANCODE_F9] = Keycode::F9; + table[SDL_SCANCODE_F10] = Keycode::F10; + table[SDL_SCANCODE_F11] = Keycode::F11; + table[SDL_SCANCODE_F12] = Keycode::F12; + table[SDL_SCANCODE_KP_0] = Keycode::KP0; + table[SDL_SCANCODE_KP_1] = Keycode::KP1; + table[SDL_SCANCODE_KP_2] = Keycode::KP2; + table[SDL_SCANCODE_KP_3] = Keycode::KP3; + table[SDL_SCANCODE_KP_4] = Keycode::KP4; + table[SDL_SCANCODE_KP_5] = Keycode::KP5; + table[SDL_SCANCODE_KP_6] = Keycode::KP6; + table[SDL_SCANCODE_KP_7] = Keycode::KP7; + table[SDL_SCANCODE_KP_8] = Keycode::KP8; + table[SDL_SCANCODE_KP_9] = Keycode::KP9; + table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT; + table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL; + table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT; + table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER; + table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT; + table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL; + table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT; + table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER; + table[SDL_SCANCODE_MENU] = Keycode::MENU; + + return table; + }(); + return LOOKUP_TABLE; +} - if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { - return Keycode::NONE; - } +// Function that uses the shared table +Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { + if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { + return Keycode::NONE; + } + return get_lookup_table()[sdl_key]; +} +std::array<bool, SDL_NUM_SCANCODES> SDLContext::get_keyboard_state() { + // Array to hold the key states (true if pressed, false if not) + std::array<bool, SDL_NUM_SCANCODES> keyState; + + const Uint8* current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + // Set true if the key is pressed, false if not + keyState[i] = currentState[i] != 0; + } - return LOOKUP_TABLE[sdl_key]; + return keyState; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 1f83985..0f503f3 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -152,7 +152,8 @@ private: * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized. */ Keycode sdl_to_keycode(SDL_Keycode sdl_key); - + static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table(); + std::array<Keycode, SDL_NUM_SCANCODES> get_keyboard_state(); /** * \brief Converts an SDL mouse button code to the custom MouseButton type. * diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index b7d2eb4..c3bf4d4 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -13,6 +13,7 @@ void InputSystem::update() { RefVector<Button> buttons = mgr.get_components_by_type<Button>(); RefVector<Camera> cameras = mgr.get_components_by_type<Camera>(); OptionalRef<Camera> curr_cam_ref; + // Find the active camera for (Camera & cam : cameras) { if (!cam.active) continue; @@ -20,122 +21,126 @@ void InputSystem::update() { break; } if (!curr_cam_ref) return; + Camera & current_cam = curr_cam_ref; RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(current_cam.game_object_id); Transform & cam_transform = transform_vec.front().get(); - int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x - - (current_cam.viewport_size.x / 2); - int camera_origin_y = + ivec2 camera_origin; camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y - (current_cam.viewport_size.y / 2); - camera_origin + camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x + - (current_cam.viewport_size.x / 2); + for (const SDLContext::EventData & event : event_list) { - int adjusted_mouse_x = event.mouse_data.mouse_position.x + camera_origin_x; - int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin_y; - // check if the mouse is within the viewport - bool mouse_in_viewport - = !(adjusted_mouse_x < camera_origin_x - || adjusted_mouse_x > camera_origin_x + current_cam.viewport_size.x - || adjusted_mouse_y < camera_origin_y - || adjusted_mouse_y > camera_origin_y + current_cam.viewport_size.y); - - switch (event.event_type) { - case SDLContext::EventType::KEYDOWN: - event_mgr.queue_event<KeyPressEvent>(KeyPressEvent{ - .repeat = event.key_data.key_repeat, - .key = event.key_data.key, - }); - break; - case SDLContext::EventType::KEYUP: - event_mgr.queue_event<KeyReleaseEvent>(KeyReleaseEvent{ - .key = event.key_data.key, - }); - break; - case SDLContext::EventType::MOUSEDOWN: - if (!mouse_in_viewport) { + // Only calculate mouse coordinates for relevant events + if (event.event_type == SDLContext::EventType::MOUSEDOWN + || event.event_type == SDLContext::EventType::MOUSEUP + || event.event_type == SDLContext::EventType::MOUSEMOVE + || event.event_type == SDLContext::EventType::MOUSEWHEEL) { + + int adjusted_mouse_x = event.mouse_data.mouse_position.x + camera_origin.x; + int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin.y; + + // Check if the mouse is within the viewport + bool mouse_in_viewport = !(adjusted_mouse_x < camera_origin.x + || adjusted_mouse_x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse_y < camera_origin.y + || adjusted_mouse_y > camera_origin.y + current_cam.viewport_size.y); + + if (!mouse_in_viewport) continue; + + // Handle mouse-specific events + switch (event.event_type) { + case SDLContext::EventType::MOUSEDOWN: + event_mgr.queue_event<MousePressEvent>({ + .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, + }); + this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y}; + this->last_mouse_button = event.mouse_data.mouse_button; break; - } - event_mgr.queue_event<MousePressEvent>(MousePressEvent{ - .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, - .button = event.mouse_data.mouse_button, - }); - this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y}; - this->last_mouse_button = event.mouse_data.mouse_button; - break; - case SDLContext::EventType::MOUSEUP: { - if (!mouse_in_viewport) { + + case SDLContext::EventType::MOUSEUP: { + event_mgr.queue_event<MouseReleaseEvent>({ + .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, + }); + int delta_x = adjusted_mouse_x - this->last_mouse_down_position.x; + int delta_y = adjusted_mouse_y - this->last_mouse_down_position.y; + + if (this->last_mouse_button == event.mouse_data.mouse_button + && std::abs(delta_x) <= click_tolerance + && std::abs(delta_y) <= click_tolerance) { + event_mgr.queue_event<MouseClickEvent>({ + .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .button = event.mouse_data.mouse_button, + }); + this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y); + } break; } - event_mgr.queue_event<MouseReleaseEvent>(MouseReleaseEvent{ - .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, - .button = event.mouse_data.mouse_button, - }); - int delta_x = adjusted_mouse_x - this->last_mouse_down_position.x; - int delta_y = adjusted_mouse_y - this->last_mouse_down_position.y; - - if (this->last_mouse_button == event.mouse_data.mouse_button - && std::abs(delta_x) <= click_tolerance - && std::abs(delta_y) <= click_tolerance) { - event_mgr.queue_event<MouseClickEvent>(MouseClickEvent{ - .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, - .button = event.mouse_data.mouse_button, + + case SDLContext::EventType::MOUSEMOVE: + event_mgr.queue_event<MouseMoveEvent>({ + .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_delta = event.mouse_data.rel_mouse_move, }); + this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y); + break; - this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y); - } - } break; - case SDLContext::EventType::MOUSEMOVE: - if (!mouse_in_viewport) { + case SDLContext::EventType::MOUSEWHEEL: + event_mgr.queue_event<MouseScrollEvent>({ + .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .scroll_direction = event.mouse_data.scroll_direction, + .scroll_delta = event.mouse_data.scroll_delta, + }); break; - } - event_mgr.queue_event<MouseMoveEvent>(MouseMoveEvent{ - .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, - .mouse_delta = event.mouse_data.rel_mouse_move, - }); - this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y); - break; - case SDLContext::EventType::MOUSEWHEEL: - event_mgr.queue_event<MouseScrollEvent>(MouseScrollEvent{ - .mouse_pos = {adjusted_mouse_x,adjusted_mouse_y}, - .scroll_direction = event.mouse_data.scroll_direction, - .scroll_delta = event.mouse_data.scroll_delta, - }); - break; - case SDLContext::EventType::SHUTDOWN: - event_mgr.queue_event<ShutDownEvent>(ShutDownEvent{}); - break; - case SDLContext::EventType::WINDOW_EXPOSE: - event_mgr.queue_event<WindowExposeEvent>(WindowExposeEvent{}); - break; - case SDLContext::EventType::WINDOW_RESIZE: - event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{ - .dimensions = event.window_data.resize_dimension, - }); - break; - case SDLContext::EventType::WINDOW_MOVE: - event_mgr.queue_event<WindowMoveEvent>(WindowMoveEvent{ - .delta_move = event.window_data.move_delta, - }); - break; - case SDLContext::EventType::WINDOW_MINIMIZE: - event_mgr.queue_event<WindowMinimizeEvent>(WindowMinimizeEvent{}); - break; - case SDLContext::EventType::WINDOW_MAXIMIZE: - event_mgr.queue_event<WindowMaximizeEvent>(WindowMaximizeEvent{}); - break; - case SDLContext::EventType::WINDOW_FOCUS_GAIN: - event_mgr.queue_event<WindowFocusGainEvent>(WindowFocusGainEvent{}); - break; - case SDLContext::EventType::WINDOW_FOCUS_LOST: - event_mgr.queue_event<WindowFocusLostEvent>(WindowFocusLostEvent{}); - break; - default: - break; + + default: + break; + } + } else { + // Handle non-mouse events + switch (event.event_type) { + case SDLContext::EventType::KEYDOWN: + event_mgr.queue_event<KeyPressEvent>({.repeat = event.key_data.key_repeat, .key = event.key_data.key}); + break; + case SDLContext::EventType::KEYUP: + event_mgr.queue_event<KeyReleaseEvent>({.key = event.key_data.key}); + break; + case SDLContext::EventType::SHUTDOWN: + event_mgr.queue_event<ShutDownEvent>({}); + break; + case SDLContext::EventType::WINDOW_EXPOSE: + event_mgr.queue_event<WindowExposeEvent>({}); + break; + case SDLContext::EventType::WINDOW_RESIZE: + event_mgr.queue_event<WindowResizeEvent>({.dimensions = event.window_data.resize_dimension}); + break; + case SDLContext::EventType::WINDOW_MOVE: + event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.window_data.move_delta}); + break; + case SDLContext::EventType::WINDOW_MINIMIZE: + event_mgr.queue_event<WindowMinimizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_MAXIMIZE: + event_mgr.queue_event<WindowMaximizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_GAIN: + event_mgr.queue_event<WindowFocusGainEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_LOST: + event_mgr.queue_event<WindowFocusLostEvent>({}); + break; + default: + break; + } } } } + void InputSystem::handle_move(const SDLContext::EventData & event_data, const int adjusted_mouse_x, const int adjusted_mouse_y) { ComponentManager & mgr = this->mediator.component_manager; -- cgit v1.2.3 From 87c41870e7e66308ee0c74270e1f91f4943bd733 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 13:46:45 +0100 Subject: testing window events --- src/crepe/api/KeyCodes.h | 6 +-- src/crepe/facade/SDLContext.cpp | 85 +++++++++++++++++++++------------------- src/crepe/facade/SDLContext.h | 32 ++++++++++----- src/crepe/system/InputSystem.cpp | 8 +++- src/test/InputTest.cpp | 27 ++++++++++++- 5 files changed, 101 insertions(+), 57 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index 6204cf2..f704fbb 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -13,7 +13,7 @@ enum class MouseButton { }; //! Enumeration for keyboard key inputs, including printable characters, function keys, and keypad keys. -enum class Keycode { +typedef enum { NONE = 0, //!< No key input. SPACE = 32, //!< Spacebar. APOSTROPHE = 39, //!< Apostrophe ('). @@ -151,6 +151,6 @@ enum class Keycode { /// \} MENU = 348, //!< Menu key. //! Not actually a key instead its the amount of keycodes there are for array indexing - NUM_KEYCODES = 113, -}; + NUM_KEYCODES = 512, +} Keycode; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 9e10803..fdc83b2 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,6 +6,9 @@ #include <SDL2/SDL_render.h> #include <SDL2/SDL_surface.h> #include <SDL2/SDL_video.h> + +#include <iostream> + #include <array> #include <cmath> #include <cstddef> @@ -77,8 +80,9 @@ SDLContext::~SDLContext() { SDL_Quit(); } -static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() { - static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] { +// Function that uses the shared table +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); @@ -184,25 +188,20 @@ static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table() { return table; }(); - return LOOKUP_TABLE; -} - -// Function that uses the shared table -Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { return Keycode::NONE; } - return get_lookup_table()[sdl_key]; + return LOOKUP_TABLE[sdl_key]; } -std::array<bool, SDL_NUM_SCANCODES> SDLContext::get_keyboard_state() { +std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { // Array to hold the key states (true if pressed, false if not) std::array<bool, SDL_NUM_SCANCODES> keyState; const Uint8* current_state = SDL_GetKeyboardState(nullptr); - + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { // Set true if the key is pressed, false if not - keyState[i] = currentState[i] != 0; + keyState[i] = current_state[i] != 0; } return keyState; @@ -428,7 +427,36 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { // Forward window events for further processing case SDL_WINDOWEVENT: - handle_window_event(event.window, event_list); + switch (event.window.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + { + std::cout << "window resize" << std::endl; + SDLContext::EventData event_data; + event_data.event_type = SDLContext::EventType::WINDOW_RESIZE; + event_data.window_data.resize_dimension = {event.window.data1,event.window.data2}; + event_list.push_back(event_data); + break; + } + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, + {{event.window.data1, event.window.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } break; } } @@ -436,35 +464,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { return event_list; } -// Separate function for SDL_WINDOWEVENT subtypes -void SDLContext::handle_window_event(const SDL_WindowEvent& window_event, - std::vector<SDLContext::EventData>& event_list) { - switch (window_event.event) { - case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_RESIZED: - event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, - {{}, {window_event.data1, window_event.data2}}}); - break; - case SDL_WINDOWEVENT_MOVED: - event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, - {{window_event.data1, window_event.data2}, {}}}); - break; - case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - break; - } -} +// // Separate function for SDL_WINDOWEVENT subtypes +// void SDLContext::handle_event(const SDL_WindowEvent& event, +// std::vector<SDLContext::EventData>& event_list) { +// } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 0f503f3..98be988 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -9,6 +9,7 @@ #include <functional> #include <memory> #include <string> +#include <array> #include "api/Camera.h" #include "api/Color.h" @@ -134,14 +135,14 @@ private: * \return Events that occurred since last call to `get_events()` */ std::vector<SDLContext::EventData> get_events(); - /** - * \brief Fills event_list with triggered window events - * - * This method checks if any window events are triggered and adds them to the event_list. - * - */ - void handle_window_event(const SDL_WindowEvent& window_event, - std::vector<SDLContext::EventData>& event_list); + // /** + // * \brief Fills event_list with triggered window events + // * + // * This method checks if any window events are triggered and adds them to the event_list. + // * + // */ + // void handle_window_event(const SDL_WindowEvent& window_event, + // std::vector<SDLContext::EventData>& event_list); /** * \brief Converts an SDL key code to the custom Keycode type. * @@ -152,8 +153,19 @@ private: * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized. */ Keycode sdl_to_keycode(SDL_Keycode sdl_key); - static const std::array<Keycode, SDL_NUM_SCANCODES>& get_lookup_table(); - std::array<Keycode, SDL_NUM_SCANCODES> get_keyboard_state(); + /** + * \brief Retrieves the current state of the keyboard. + * + * This method returns the state of all keys on the keyboard, represented as a + * `std::array` of boolean values. Each element of the array corresponds to a + * specific key defined in the `Keycode` enum, and the value indicates whether + * the key is currently pressed (true) or not pressed (false). + * + * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of + * each key on the keyboard, where `true` means the key is pressed, and + * `false` means it is not pressed. + */ + std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state(); /** * \brief Converts an SDL mouse button code to the custom MouseButton type. * diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index c3bf4d4..7c33308 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,3 +1,6 @@ + +#include <iostream> + #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" @@ -34,6 +37,7 @@ void InputSystem::update() { - (current_cam.viewport_size.x / 2); for (const SDLContext::EventData & event : event_list) { + std::cout << "event type: " << event.event_type << std::endl; // Only calculate mouse coordinates for relevant events if (event.event_type == SDLContext::EventType::MOUSEDOWN || event.event_type == SDLContext::EventType::MOUSEUP @@ -102,6 +106,7 @@ void InputSystem::update() { break; } } else { + std::cout << "non mouse event" << std::endl; // Handle non-mouse events switch (event.event_type) { case SDLContext::EventType::KEYDOWN: @@ -117,7 +122,8 @@ void InputSystem::update() { event_mgr.queue_event<WindowExposeEvent>({}); break; case SDLContext::EventType::WINDOW_RESIZE: - event_mgr.queue_event<WindowResizeEvent>({.dimensions = event.window_data.resize_dimension}); + std::cout << "input system queue" << std::endl; + event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension}); break; case SDLContext::EventType::WINDOW_MOVE: event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.window_data.move_delta}); diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 4d35eef..7d4a017 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -1,4 +1,7 @@ #include <gtest/gtest.h> + +#include <iostream> + #define protected public #define private public #include "api/KeyCodes.h" @@ -32,8 +35,6 @@ public: protected: void SetUp() override { - mediator.event_manager = event_manager; - mediator.component_manager = mgr; event_manager.clear(); } @@ -291,3 +292,25 @@ TEST_F(InputTest, testButtonHover) { event_manager.dispatch_events(); EXPECT_TRUE(button.hover); } + +TEST_F(InputTest, WindowResizeTest) { + bool callback_triggered = false; + EventHandler<WindowResizeEvent> on_window_resize = [&](const WindowResizeEvent & event) { + std::cout << "test callback" << std::endl; + callback_triggered = true; + EXPECT_EQ(event.dimensions.x, 0); + EXPECT_EQ(event.dimensions.y, 0); + return false; + }; + event_manager.subscribe<WindowResizeEvent>(on_window_resize); + SDL_Event resize_event; + SDL_zero(resize_event); + resize_event.type = SDL_WINDOWEVENT; + resize_event.window.event = SDL_WINDOWEVENT_RESIZED; + resize_event.window.data1 = 800; // new width + resize_event.window.data2 = 600; // new height + SDL_PushEvent(&resize_event); + input_system.update(); + event_manager.dispatch_events(); + EXPECT_TRUE(callback_triggered); +} -- cgit v1.2.3 From ae141f77fc54638bed0cea9213fe8900769e5d92 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 13:49:22 +0100 Subject: seperated long function --- src/crepe/facade/SDLContext.cpp | 65 ++++++++++++++++++++--------------------- src/crepe/facade/SDLContext.h | 16 +++++----- 2 files changed, 39 insertions(+), 42 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index fdc83b2..f336fd3 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -427,36 +427,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { // Forward window events for further processing case SDL_WINDOWEVENT: - switch (event.window.event) { - case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_RESIZED: - { - std::cout << "window resize" << std::endl; - SDLContext::EventData event_data; - event_data.event_type = SDLContext::EventType::WINDOW_RESIZE; - event_data.window_data.resize_dimension = {event.window.data1,event.window.data2}; - event_list.push_back(event_data); - break; - } - case SDL_WINDOWEVENT_MOVED: - event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, - {{event.window.data1, event.window.data2}, {}}}); - break; - case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - break; - } + this->handle_window_event(event.window, event_list); break; } } @@ -464,10 +435,36 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { return event_list; } -// // Separate function for SDL_WINDOWEVENT subtypes -// void SDLContext::handle_event(const SDL_WindowEvent& event, -// std::vector<SDLContext::EventData>& event_list) { -// } +// Separate function for SDL_WINDOWEVENT subtypes +void SDLContext::handle_window_event(const SDL_WindowEvent& window_event, + std::vector<SDLContext::EventData>& event_list) { + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + std::cout << "window resize" << std::endl; + event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, + {{}, {window_event.data1, window_event.data2}}}); + break; + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, + {{window_event.data1, window_event.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } +} diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 98be988..21d17c7 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -135,14 +135,14 @@ private: * \return Events that occurred since last call to `get_events()` */ std::vector<SDLContext::EventData> get_events(); - // /** - // * \brief Fills event_list with triggered window events - // * - // * This method checks if any window events are triggered and adds them to the event_list. - // * - // */ - // void handle_window_event(const SDL_WindowEvent& window_event, - // std::vector<SDLContext::EventData>& event_list); + /** + * \brief Fills event_list with triggered window events + * + * This method checks if any window events are triggered and adds them to the event_list. + * + */ + void handle_window_event(const SDL_WindowEvent& window_event, + std::vector<SDLContext::EventData>& event_list); /** * \brief Converts an SDL key code to the custom Keycode type. * -- cgit v1.2.3 From 65747afc0dadd7f0d9d93f1d0984f442c11eec82 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 14:14:11 +0100 Subject: resize/move tests working --- src/crepe/facade/SDLContext.cpp | 3 --- src/crepe/system/InputSystem.cpp | 5 ----- src/test/InputTest.cpp | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index b761ca1..ce8218a 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -7,8 +7,6 @@ #include <SDL2/SDL_surface.h> #include <SDL2/SDL_video.h> -#include <iostream> - #include <array> #include <cmath> #include <cstddef> @@ -443,7 +441,6 @@ void SDLContext::handle_window_event(const SDL_WindowEvent& window_event, event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); break; case SDL_WINDOWEVENT_RESIZED: - std::cout << "window resize" << std::endl; event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, {{}, {window_event.data1, window_event.data2}}}); break; diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 7c33308..dd45821 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,6 +1,4 @@ -#include <iostream> - #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" @@ -37,7 +35,6 @@ void InputSystem::update() { - (current_cam.viewport_size.x / 2); for (const SDLContext::EventData & event : event_list) { - std::cout << "event type: " << event.event_type << std::endl; // Only calculate mouse coordinates for relevant events if (event.event_type == SDLContext::EventType::MOUSEDOWN || event.event_type == SDLContext::EventType::MOUSEUP @@ -106,7 +103,6 @@ void InputSystem::update() { break; } } else { - std::cout << "non mouse event" << std::endl; // Handle non-mouse events switch (event.event_type) { case SDLContext::EventType::KEYDOWN: @@ -122,7 +118,6 @@ void InputSystem::update() { event_mgr.queue_event<WindowExposeEvent>({}); break; case SDLContext::EventType::WINDOW_RESIZE: - std::cout << "input system queue" << std::endl; event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension}); break; case SDLContext::EventType::WINDOW_MOVE: diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 7d4a017..0c81cfa 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -1,7 +1,4 @@ #include <gtest/gtest.h> - -#include <iostream> - #define protected public #define private public #include "api/KeyCodes.h" @@ -294,12 +291,15 @@ TEST_F(InputTest, testButtonHover) { } TEST_F(InputTest, WindowResizeTest) { + GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); + auto & camera = obj.add_component<Camera>( + ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); + camera.active = true; bool callback_triggered = false; EventHandler<WindowResizeEvent> on_window_resize = [&](const WindowResizeEvent & event) { - std::cout << "test callback" << std::endl; callback_triggered = true; - EXPECT_EQ(event.dimensions.x, 0); - EXPECT_EQ(event.dimensions.y, 0); + EXPECT_EQ(event.dimensions.x, 800); + EXPECT_EQ(event.dimensions.y, 600); return false; }; event_manager.subscribe<WindowResizeEvent>(on_window_resize); @@ -314,3 +314,27 @@ TEST_F(InputTest, WindowResizeTest) { event_manager.dispatch_events(); EXPECT_TRUE(callback_triggered); } +TEST_F(InputTest, WindowMoveTest) { + GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); + auto & camera = obj.add_component<Camera>( + ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); + camera.active = true; + bool callback_triggered = false; + EventHandler<WindowMoveEvent> on_window_move = [&](const WindowMoveEvent & event) { + callback_triggered = true; + EXPECT_EQ(event.delta_move.x, 800); + EXPECT_EQ(event.delta_move.y, 600); + return false; + }; + event_manager.subscribe<WindowMoveEvent>(on_window_move); + SDL_Event resize_event; + SDL_zero(resize_event); + resize_event.type = SDL_WINDOWEVENT; + resize_event.window.event = SDL_WINDOWEVENT_MOVED; + resize_event.window.data1 = 800; // new width + resize_event.window.data2 = 600; // new height + SDL_PushEvent(&resize_event); + input_system.update(); + event_manager.dispatch_events(); + EXPECT_TRUE(callback_triggered); +} -- cgit v1.2.3 From 2ff3369a7aaf98936bf93f1c7c0dbfcaa38c31d7 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 14:20:39 +0100 Subject: make format --- src/crepe/api/Event.h | 34 ++-- src/crepe/api/Transform.h | 4 +- src/crepe/facade/SDLContext.cpp | 399 ++++++++++++++++++++------------------- src/crepe/facade/SDLContext.h | 14 +- src/crepe/system/InputSystem.cpp | 33 ++-- src/test/EventTest.cpp | 12 +- src/test/InputTest.cpp | 28 ++- 7 files changed, 275 insertions(+), 249 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 265e925..d3e99af 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -39,7 +39,7 @@ public: class MousePressEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0,0}; + ivec2 mouse_pos = {0, 0}; //! The mouse button that was pressed. MouseButton button = MouseButton::NONE; @@ -51,7 +51,7 @@ public: class MouseClickEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0,0}; + ivec2 mouse_pos = {0, 0}; //! The mouse button that was clicked. MouseButton button = MouseButton::NONE; @@ -63,7 +63,7 @@ public: class MouseReleaseEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0,0}; + ivec2 mouse_pos = {0, 0}; //! The mouse button that was released. MouseButton button = MouseButton::NONE; @@ -75,9 +75,9 @@ public: class MouseMoveEvent : public Event { public: //! new mouse position - ivec2 mouse_pos = {0,0}; + ivec2 mouse_pos = {0, 0}; //! The change in mouse position relative to the last position (in pixels). - ivec2 mouse_delta = {0,0}; + ivec2 mouse_delta = {0, 0}; }; /** @@ -86,7 +86,7 @@ public: class MouseScrollEvent : public Event { public: //! mouse position when the scroll happened. - ivec2 mouse_pos = {0,0}; + ivec2 mouse_pos = {0, 0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; //! scroll amount in y axis (from and away from the person). @@ -112,35 +112,35 @@ class ShutDownEvent : public Event {}; * * When two windows overlap the bottom window gets distorted and that window has to be redrawn. */ -class WindowExposeEvent : public Event{}; +class WindowExposeEvent : public Event {}; /** * \brief Event triggered to indicate the window is resized. */ -class WindowResizeEvent : public Event{ - public: +class WindowResizeEvent : public Event { +public: //! new window dimensions - ivec2 dimensions = {0,0}; + ivec2 dimensions = {0, 0}; }; /** * \brief Event triggered to indicate the window is moved. */ -class WindowMoveEvent : public Event{ - public: +class WindowMoveEvent : public Event { +public: //! The change in position relative to the last position (in pixels). - ivec2 delta_move = {0,0}; + ivec2 delta_move = {0, 0}; }; /** * \brief Event triggered to indicate the window is minimized. */ -class WindowMinimizeEvent : public Event{}; +class WindowMinimizeEvent : public Event {}; /** * \brief Event triggered to indicate the window is maximized */ -class WindowMaximizeEvent : public Event{}; +class WindowMaximizeEvent : public Event {}; /** * \brief Event triggered to indicate the window gained focus @@ -148,7 +148,7 @@ class WindowMaximizeEvent : public Event{}; * This event is triggered when the window receives focus, meaning it becomes the active window * for user interaction. */ -class WindowFocusGainEvent : public Event{}; +class WindowFocusGainEvent : public Event {}; /** * \brief Event triggered to indicate the window lost focus @@ -156,6 +156,6 @@ class WindowFocusGainEvent : public Event{}; * This event is triggered when the window loses focus, meaning it is no longer the active window * for user interaction. */ -class WindowFocusLostEvent : public Event{}; +class WindowFocusLostEvent : public Event {}; } // namespace crepe diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h index 78407ee..b63acaf 100644 --- a/src/crepe/api/Transform.h +++ b/src/crepe/api/Transform.h @@ -14,9 +14,9 @@ namespace crepe { class Transform : public Component { public: //! Specifies the coordinate space for transformations. - enum Space { + enum Space { //! coordinates are relative to the active camera - HUD, + HUD, //! coordinates are relative to the game world WORLD, }; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index ce8218a..722c165 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -81,128 +81,128 @@ SDLContext::~SDLContext() { // Function that uses the shared table 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); - - // Map all SDL scancodes to Keycodes - table[SDL_SCANCODE_SPACE] = Keycode::SPACE; - table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; - table[SDL_SCANCODE_COMMA] = Keycode::COMMA; - table[SDL_SCANCODE_MINUS] = Keycode::MINUS; - table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD; - table[SDL_SCANCODE_SLASH] = Keycode::SLASH; - table[SDL_SCANCODE_0] = Keycode::D0; - table[SDL_SCANCODE_1] = Keycode::D1; - table[SDL_SCANCODE_2] = Keycode::D2; - table[SDL_SCANCODE_3] = Keycode::D3; - table[SDL_SCANCODE_4] = Keycode::D4; - table[SDL_SCANCODE_5] = Keycode::D5; - table[SDL_SCANCODE_6] = Keycode::D6; - table[SDL_SCANCODE_7] = Keycode::D7; - table[SDL_SCANCODE_8] = Keycode::D8; - table[SDL_SCANCODE_9] = Keycode::D9; - table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON; - table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL; - table[SDL_SCANCODE_A] = Keycode::A; - table[SDL_SCANCODE_B] = Keycode::B; - table[SDL_SCANCODE_C] = Keycode::C; - table[SDL_SCANCODE_D] = Keycode::D; - table[SDL_SCANCODE_E] = Keycode::E; - table[SDL_SCANCODE_F] = Keycode::F; - table[SDL_SCANCODE_G] = Keycode::G; - table[SDL_SCANCODE_H] = Keycode::H; - table[SDL_SCANCODE_I] = Keycode::I; - table[SDL_SCANCODE_J] = Keycode::J; - table[SDL_SCANCODE_K] = Keycode::K; - table[SDL_SCANCODE_L] = Keycode::L; - table[SDL_SCANCODE_M] = Keycode::M; - table[SDL_SCANCODE_N] = Keycode::N; - table[SDL_SCANCODE_O] = Keycode::O; - table[SDL_SCANCODE_P] = Keycode::P; - table[SDL_SCANCODE_Q] = Keycode::Q; - table[SDL_SCANCODE_R] = Keycode::R; - table[SDL_SCANCODE_S] = Keycode::S; - table[SDL_SCANCODE_T] = Keycode::T; - table[SDL_SCANCODE_U] = Keycode::U; - table[SDL_SCANCODE_V] = Keycode::V; - table[SDL_SCANCODE_W] = Keycode::W; - table[SDL_SCANCODE_X] = Keycode::X; - table[SDL_SCANCODE_Y] = Keycode::Y; - table[SDL_SCANCODE_Z] = Keycode::Z; - table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET; - table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH; - table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET; - table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT; - table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE; - table[SDL_SCANCODE_RETURN] = Keycode::ENTER; - table[SDL_SCANCODE_TAB] = Keycode::TAB; - table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE; - table[SDL_SCANCODE_INSERT] = Keycode::INSERT; - table[SDL_SCANCODE_DELETE] = Keycode::DELETE; - table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT; - table[SDL_SCANCODE_LEFT] = Keycode::LEFT; - table[SDL_SCANCODE_DOWN] = Keycode::DOWN; - table[SDL_SCANCODE_UP] = Keycode::UP; - table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP; - table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN; - table[SDL_SCANCODE_HOME] = Keycode::HOME; - table[SDL_SCANCODE_END] = Keycode::END; - table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK; - table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK; - table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK; - table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN; - table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE; - table[SDL_SCANCODE_F1] = Keycode::F1; - table[SDL_SCANCODE_F2] = Keycode::F2; - table[SDL_SCANCODE_F3] = Keycode::F3; - table[SDL_SCANCODE_F4] = Keycode::F4; - table[SDL_SCANCODE_F5] = Keycode::F5; - table[SDL_SCANCODE_F6] = Keycode::F6; - table[SDL_SCANCODE_F7] = Keycode::F7; - table[SDL_SCANCODE_F8] = Keycode::F8; - table[SDL_SCANCODE_F9] = Keycode::F9; - table[SDL_SCANCODE_F10] = Keycode::F10; - table[SDL_SCANCODE_F11] = Keycode::F11; - table[SDL_SCANCODE_F12] = Keycode::F12; - table[SDL_SCANCODE_KP_0] = Keycode::KP0; - table[SDL_SCANCODE_KP_1] = Keycode::KP1; - table[SDL_SCANCODE_KP_2] = Keycode::KP2; - table[SDL_SCANCODE_KP_3] = Keycode::KP3; - table[SDL_SCANCODE_KP_4] = Keycode::KP4; - table[SDL_SCANCODE_KP_5] = Keycode::KP5; - table[SDL_SCANCODE_KP_6] = Keycode::KP6; - table[SDL_SCANCODE_KP_7] = Keycode::KP7; - table[SDL_SCANCODE_KP_8] = Keycode::KP8; - table[SDL_SCANCODE_KP_9] = Keycode::KP9; - table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT; - table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL; - table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT; - table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER; - table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT; - table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL; - table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT; - table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER; - table[SDL_SCANCODE_MENU] = Keycode::MENU; - - return table; - }(); - if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { - return Keycode::NONE; - } - return LOOKUP_TABLE[sdl_key]; + std::array<Keycode, SDL_NUM_SCANCODES> table{}; + table.fill(Keycode::NONE); + + // Map all SDL scancodes to Keycodes + table[SDL_SCANCODE_SPACE] = Keycode::SPACE; + table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; + table[SDL_SCANCODE_COMMA] = Keycode::COMMA; + table[SDL_SCANCODE_MINUS] = Keycode::MINUS; + table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD; + table[SDL_SCANCODE_SLASH] = Keycode::SLASH; + table[SDL_SCANCODE_0] = Keycode::D0; + table[SDL_SCANCODE_1] = Keycode::D1; + table[SDL_SCANCODE_2] = Keycode::D2; + table[SDL_SCANCODE_3] = Keycode::D3; + table[SDL_SCANCODE_4] = Keycode::D4; + table[SDL_SCANCODE_5] = Keycode::D5; + table[SDL_SCANCODE_6] = Keycode::D6; + table[SDL_SCANCODE_7] = Keycode::D7; + table[SDL_SCANCODE_8] = Keycode::D8; + table[SDL_SCANCODE_9] = Keycode::D9; + table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON; + table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL; + table[SDL_SCANCODE_A] = Keycode::A; + table[SDL_SCANCODE_B] = Keycode::B; + table[SDL_SCANCODE_C] = Keycode::C; + table[SDL_SCANCODE_D] = Keycode::D; + table[SDL_SCANCODE_E] = Keycode::E; + table[SDL_SCANCODE_F] = Keycode::F; + table[SDL_SCANCODE_G] = Keycode::G; + table[SDL_SCANCODE_H] = Keycode::H; + table[SDL_SCANCODE_I] = Keycode::I; + table[SDL_SCANCODE_J] = Keycode::J; + table[SDL_SCANCODE_K] = Keycode::K; + table[SDL_SCANCODE_L] = Keycode::L; + table[SDL_SCANCODE_M] = Keycode::M; + table[SDL_SCANCODE_N] = Keycode::N; + table[SDL_SCANCODE_O] = Keycode::O; + table[SDL_SCANCODE_P] = Keycode::P; + table[SDL_SCANCODE_Q] = Keycode::Q; + table[SDL_SCANCODE_R] = Keycode::R; + table[SDL_SCANCODE_S] = Keycode::S; + table[SDL_SCANCODE_T] = Keycode::T; + table[SDL_SCANCODE_U] = Keycode::U; + table[SDL_SCANCODE_V] = Keycode::V; + table[SDL_SCANCODE_W] = Keycode::W; + table[SDL_SCANCODE_X] = Keycode::X; + table[SDL_SCANCODE_Y] = Keycode::Y; + table[SDL_SCANCODE_Z] = Keycode::Z; + table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET; + table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH; + table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET; + table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT; + table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE; + table[SDL_SCANCODE_RETURN] = Keycode::ENTER; + table[SDL_SCANCODE_TAB] = Keycode::TAB; + table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE; + table[SDL_SCANCODE_INSERT] = Keycode::INSERT; + table[SDL_SCANCODE_DELETE] = Keycode::DELETE; + table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT; + table[SDL_SCANCODE_LEFT] = Keycode::LEFT; + table[SDL_SCANCODE_DOWN] = Keycode::DOWN; + table[SDL_SCANCODE_UP] = Keycode::UP; + table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP; + table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN; + table[SDL_SCANCODE_HOME] = Keycode::HOME; + table[SDL_SCANCODE_END] = Keycode::END; + table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK; + table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK; + table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK; + table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN; + table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE; + table[SDL_SCANCODE_F1] = Keycode::F1; + table[SDL_SCANCODE_F2] = Keycode::F2; + table[SDL_SCANCODE_F3] = Keycode::F3; + table[SDL_SCANCODE_F4] = Keycode::F4; + table[SDL_SCANCODE_F5] = Keycode::F5; + table[SDL_SCANCODE_F6] = Keycode::F6; + table[SDL_SCANCODE_F7] = Keycode::F7; + table[SDL_SCANCODE_F8] = Keycode::F8; + table[SDL_SCANCODE_F9] = Keycode::F9; + table[SDL_SCANCODE_F10] = Keycode::F10; + table[SDL_SCANCODE_F11] = Keycode::F11; + table[SDL_SCANCODE_F12] = Keycode::F12; + table[SDL_SCANCODE_KP_0] = Keycode::KP0; + table[SDL_SCANCODE_KP_1] = Keycode::KP1; + table[SDL_SCANCODE_KP_2] = Keycode::KP2; + table[SDL_SCANCODE_KP_3] = Keycode::KP3; + table[SDL_SCANCODE_KP_4] = Keycode::KP4; + table[SDL_SCANCODE_KP_5] = Keycode::KP5; + table[SDL_SCANCODE_KP_6] = Keycode::KP6; + table[SDL_SCANCODE_KP_7] = Keycode::KP7; + table[SDL_SCANCODE_KP_8] = Keycode::KP8; + table[SDL_SCANCODE_KP_9] = Keycode::KP9; + table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT; + table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL; + table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT; + table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER; + table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT; + table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL; + table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT; + table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER; + table[SDL_SCANCODE_MENU] = Keycode::MENU; + + return table; + }(); + if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { + return Keycode::NONE; + } + return LOOKUP_TABLE[sdl_key]; } std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) - std::array<bool, SDL_NUM_SCANCODES> keyState; + // Array to hold the key states (true if pressed, false if not) + std::array<bool, SDL_NUM_SCANCODES> keyState; - const Uint8* current_state = SDL_GetKeyboardState(nullptr); + const Uint8 * current_state = SDL_GetKeyboardState(nullptr); - for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - // Set true if the key is pressed, false if not - keyState[i] = current_state[i] != 0; - } + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + // Set true if the key is pressed, false if not + keyState[i] = current_state[i] != 0; + } - return keyState; + return keyState; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -389,83 +389,104 @@ ivec2 SDLContext::get_size(const Texture & ctx) { void SDLContext::delay(int ms) const { SDL_Delay(ms); } std::vector<SDLContext::EventData> SDLContext::get_events() { - std::vector<SDLContext::EventData> event_list; - SDL_Event event; - - // Handle general SDL events - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_QUIT: - event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); - break; - case SDL_KEYDOWN: - event_list.push_back({SDLContext::EventType::KEYDOWN, - {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, {}, {}}); - break; - case SDL_KEYUP: - event_list.push_back({SDLContext::EventType::KEYUP, - {sdl_to_keycode(event.key.keysym.scancode), false}, {}, {}}); - break; - case SDL_MOUSEBUTTONDOWN: - event_list.push_back({SDLContext::EventType::MOUSEDOWN, {}, - {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}}); - break; - case SDL_MOUSEBUTTONUP: - event_list.push_back({SDLContext::EventType::MOUSEUP, {}, - {sdl_to_mousebutton(event.button.button), {event.button.x, event.button.y}}, {}}); - break; - case SDL_MOUSEMOTION: - event_list.push_back({SDLContext::EventType::MOUSEMOVE, {}, - {{}, {event.motion.x, event.motion.y}, -1, INFINITY, {event.motion.xrel, event.motion.yrel}}, {}}); - break; - case SDL_MOUSEWHEEL: - event_list.push_back({SDLContext::EventType::MOUSEWHEEL, {}, - {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, {}}); - break; - - // Forward window events for further processing - case SDL_WINDOWEVENT: - this->handle_window_event(event.window, event_list); - break; - } - } - - return event_list; + std::vector<SDLContext::EventData> event_list; + SDL_Event event; + + // Handle general SDL events + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: + event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); + break; + case SDL_KEYDOWN: + event_list.push_back( + {SDLContext::EventType::KEYDOWN, + {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, + {}, + {}}); + break; + case SDL_KEYUP: + event_list.push_back({SDLContext::EventType::KEYUP, + {sdl_to_keycode(event.key.keysym.scancode), false}, + {}, + {}}); + break; + case SDL_MOUSEBUTTONDOWN: + event_list.push_back({SDLContext::EventType::MOUSEDOWN, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEBUTTONUP: + event_list.push_back({SDLContext::EventType::MOUSEUP, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEMOTION: + event_list.push_back({SDLContext::EventType::MOUSEMOVE, + {}, + {{}, + {event.motion.x, event.motion.y}, + -1, + INFINITY, + {event.motion.xrel, event.motion.yrel}}, + {}}); + break; + case SDL_MOUSEWHEEL: + event_list.push_back( + {SDLContext::EventType::MOUSEWHEEL, + {}, + {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, + {}}); + break; + + // Forward window events for further processing + case SDL_WINDOWEVENT: + this->handle_window_event(event.window, event_list); + break; + } + } + + return event_list; } // Separate function for SDL_WINDOWEVENT subtypes -void SDLContext::handle_window_event(const SDL_WindowEvent& window_event, - std::vector<SDLContext::EventData>& event_list) { - switch (window_event.event) { - case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_RESIZED: - event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, {}, {}, - {{}, {window_event.data1, window_event.data2}}}); - break; - case SDL_WINDOWEVENT_MOVED: - event_list.push_back({SDLContext::EventType::WINDOW_MOVE, {}, {}, - {{window_event.data1, window_event.data2}, {}}}); - break; - case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - break; - } +void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, + std::vector<SDLContext::EventData> & event_list) { + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, + {}, + {}, + {{}, {window_event.data1, window_event.data2}}}); + break; + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, + {}, + {}, + {{window_event.data1, window_event.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } } - - - void SDLContext::set_color_texture(const Texture & texture, const Color & color) { SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture.texture.get(), color.a); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 21d17c7..b65ba9c 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -5,11 +5,11 @@ #include <SDL2/SDL_rect.h> #include <SDL2/SDL_render.h> #include <SDL2/SDL_video.h> +#include <array> #include <cmath> #include <functional> #include <memory> #include <string> -#include <array> #include "api/Camera.h" #include "api/Color.h" @@ -88,18 +88,18 @@ public: WINDOW_RESIZE, WINDOW_EXPOSE, }; - struct KeyData{ + struct KeyData { Keycode key = Keycode::NONE; bool key_repeat = false; }; - struct MouseData{ + struct MouseData { MouseButton mouse_button = MouseButton::NONE; ivec2 mouse_position = {-1, -1}; int scroll_direction = -1; float scroll_delta = INFINITY; ivec2 rel_mouse_move = {-1, -1}; }; - struct WindowData{ + struct WindowData { ivec2 move_delta; ivec2 resize_dimension; }; @@ -110,7 +110,7 @@ public: MouseData mouse_data; WindowData window_data; }; - + /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -141,8 +141,8 @@ private: * This method checks if any window events are triggered and adds them to the event_list. * */ - void handle_window_event(const SDL_WindowEvent& window_event, - std::vector<SDLContext::EventData>& event_list); + void handle_window_event(const SDL_WindowEvent & window_event, + std::vector<SDLContext::EventData> & event_list); /** * \brief Converts an SDL key code to the custom Keycode type. * diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index dd45821..f5d8536 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -30,13 +30,13 @@ void InputSystem::update() { ivec2 camera_origin; camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y - - (current_cam.viewport_size.y / 2); + - (current_cam.viewport_size.y / 2); camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x - - (current_cam.viewport_size.x / 2); + - (current_cam.viewport_size.x / 2); for (const SDLContext::EventData & event : event_list) { // Only calculate mouse coordinates for relevant events - if (event.event_type == SDLContext::EventType::MOUSEDOWN + if (event.event_type == SDLContext::EventType::MOUSEDOWN || event.event_type == SDLContext::EventType::MOUSEUP || event.event_type == SDLContext::EventType::MOUSEMOVE || event.event_type == SDLContext::EventType::MOUSEWHEEL) { @@ -45,10 +45,11 @@ void InputSystem::update() { int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin.y; // Check if the mouse is within the viewport - bool mouse_in_viewport = !(adjusted_mouse_x < camera_origin.x - || adjusted_mouse_x > camera_origin.x + current_cam.viewport_size.x - || adjusted_mouse_y < camera_origin.y - || adjusted_mouse_y > camera_origin.y + current_cam.viewport_size.y); + bool mouse_in_viewport + = !(adjusted_mouse_x < camera_origin.x + || adjusted_mouse_x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse_y < camera_origin.y + || adjusted_mouse_y > camera_origin.y + current_cam.viewport_size.y); if (!mouse_in_viewport) continue; @@ -78,7 +79,8 @@ void InputSystem::update() { .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, .button = event.mouse_data.mouse_button, }); - this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, adjusted_mouse_y); + this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, + adjusted_mouse_y); } break; } @@ -106,7 +108,8 @@ void InputSystem::update() { // Handle non-mouse events switch (event.event_type) { case SDLContext::EventType::KEYDOWN: - event_mgr.queue_event<KeyPressEvent>({.repeat = event.key_data.key_repeat, .key = event.key_data.key}); + event_mgr.queue_event<KeyPressEvent>( + {.repeat = event.key_data.key_repeat, .key = event.key_data.key}); break; case SDLContext::EventType::KEYUP: event_mgr.queue_event<KeyReleaseEvent>({.key = event.key_data.key}); @@ -118,10 +121,12 @@ void InputSystem::update() { event_mgr.queue_event<WindowExposeEvent>({}); break; case SDLContext::EventType::WINDOW_RESIZE: - event_mgr.queue_event<WindowResizeEvent>(WindowResizeEvent{.dimensions = event.window_data.resize_dimension}); + event_mgr.queue_event<WindowResizeEvent>( + WindowResizeEvent{.dimensions = event.window_data.resize_dimension}); break; case SDLContext::EventType::WINDOW_MOVE: - event_mgr.queue_event<WindowMoveEvent>({.delta_move = event.window_data.move_delta}); + event_mgr.queue_event<WindowMoveEvent>( + {.delta_move = event.window_data.move_delta}); break; case SDLContext::EventType::WINDOW_MINIMIZE: event_mgr.queue_event<WindowMinimizeEvent>({}); @@ -155,7 +160,8 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, bool was_hovering = button.hover; if (button.active - && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) { + && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, + transform)) { button.hover = true; if (!was_hovering && button.on_mouse_enter) { button.on_mouse_enter(); @@ -182,7 +188,8 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const int adjus Transform & transform = transform_vec.front().get(); if (button.active - && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, transform)) { + && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, + transform)) { this->handle_button_press(button); } } diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp index 53c2469..ef7fc10 100644 --- a/src/test/EventTest.cpp +++ b/src/test/EventTest.cpp @@ -71,7 +71,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) { EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL); - MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); @@ -89,7 +89,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) { }; EventManager::get_instance().subscribe<MouseClickEvent>(mouse_handler, test_channel); - MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); @@ -122,7 +122,7 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) { }; // Test event - MouseClickEvent click_event{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}; + MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL); event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL); @@ -217,7 +217,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue events event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - both handlers should be triggered event_manager.dispatch_events(); @@ -233,7 +233,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue the same event again event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - only handler 2 should be triggered, handler 1 should NOT event_manager.dispatch_events(); @@ -248,7 +248,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { // Queue the event again event_manager.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_pos = {100,200}, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - no handler should be triggered event_manager.dispatch_events(); diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index cde774f..94549a0 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -31,9 +31,7 @@ public: //GameObject camera; protected: - void SetUp() override { - event_manager.clear(); - } + void SetUp() override { event_manager.clear(); } void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { SDL_Event event; @@ -299,12 +297,12 @@ TEST_F(InputTest, WindowResizeTest) { }; event_manager.subscribe<WindowResizeEvent>(on_window_resize); SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_RESIZED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); + SDL_zero(resize_event); + resize_event.type = SDL_WINDOWEVENT; + resize_event.window.event = SDL_WINDOWEVENT_RESIZED; + resize_event.window.data1 = 800; // new width + resize_event.window.data2 = 600; // new height + SDL_PushEvent(&resize_event); input_system.update(); event_manager.dispatch_events(); EXPECT_TRUE(callback_triggered); @@ -323,12 +321,12 @@ TEST_F(InputTest, WindowMoveTest) { }; event_manager.subscribe<WindowMoveEvent>(on_window_move); SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_MOVED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); + SDL_zero(resize_event); + resize_event.type = SDL_WINDOWEVENT; + resize_event.window.event = SDL_WINDOWEVENT_MOVED; + resize_event.window.data1 = 800; // new width + resize_event.window.data2 = 600; // new height + SDL_PushEvent(&resize_event); input_system.update(); event_manager.dispatch_events(); EXPECT_TRUE(callback_triggered); -- cgit v1.2.3 From a80477f2e7f4c18adcc6441828d17582aad2598f Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 15:29:18 +0100 Subject: get_keyboard_state working --- src/crepe/api/Config.h | 6 ++++++ src/crepe/facade/SDLContext.cpp | 29 ++++++++++++++++------------- src/crepe/facade/SDLContext.h | 36 ++++++++++++++++++------------------ src/crepe/system/InputSystem.h | 5 +++-- src/example/button.cpp | 1 - src/test/InputTest.cpp | 28 ++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 34 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..7b1a5ca 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -86,6 +86,12 @@ public: */ std::string root_pattern = ".crepe-root"; } asset; + //! Configuration for click tolerance. + struct { + //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. + int tolerance = 5; + } click_tolerance; + }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 722c165..1e8af41 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -78,8 +78,7 @@ SDLContext::~SDLContext() { SDL_Quit(); } -// Function that uses the shared table -Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { +Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] { std::array<Keycode, SDL_NUM_SCANCODES> table{}; table.fill(Keycode::NONE); @@ -192,19 +191,23 @@ Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { return LOOKUP_TABLE[sdl_key]; } std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) - std::array<bool, SDL_NUM_SCANCODES> keyState; - - const Uint8 * current_state = SDL_GetKeyboardState(nullptr); - - for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - // Set true if the key is pressed, false if not - keyState[i] = current_state[i] != 0; - } - - return keyState; + // Array to hold the key states (true if pressed, false if not) + std::array<bool, Keycode::NUM_KEYCODES> keyState{}; + SDL_PumpEvents(); + const Uint8 *current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); + + if (key != Keycode::NONE) { + keyState[key] = current_state[i] != 0; + } + } + + return keyState; } + MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { static const std::array<MouseButton, 5> MOUSE_BUTTON_LOOKUP_TABLE = [] { std::array<MouseButton, 5> table{}; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index b65ba9c..5182dca 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -110,7 +110,19 @@ public: MouseData mouse_data; WindowData window_data; }; - + /** + * \brief Retrieves the current state of the keyboard. + * + * This method returns the state of all keys on the keyboard, represented as a + * `std::array` of boolean values. Each element of the array corresponds to a + * specific key defined in the `Keycode` enum, and the value indicates whether + * the key is currently pressed (true) or not pressed (false). + * + * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of + * each key on the keyboard, where `true` means the key is pressed, and + * `false` means it is not pressed. + */ + std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state(); /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -144,28 +156,16 @@ private: void handle_window_event(const SDL_WindowEvent & window_event, std::vector<SDLContext::EventData> & event_list); /** - * \brief Converts an SDL key code to the custom Keycode type. + * \brief Converts an SDL scan code to the custom Keycode type. * - * This method maps an SDL key code to the corresponding `Keycode` enum value, + * This method maps an SDL scan code to the corresponding `Keycode` enum value, * which is used internally by the system to identify the keys. * - * \param sdl_key The SDL key code to convert. + * \param sdl_key The SDL scan code to convert. * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized. */ - Keycode sdl_to_keycode(SDL_Keycode sdl_key); - /** - * \brief Retrieves the current state of the keyboard. - * - * This method returns the state of all keys on the keyboard, represented as a - * `std::array` of boolean values. Each element of the array corresponds to a - * specific key defined in the `Keycode` enum, and the value indicates whether - * the key is currently pressed (true) or not pressed (false). - * - * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of - * each key on the keyboard, where `true` means the key is pressed, and - * `false` means it is not pressed. - */ - std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state(); + Keycode sdl_to_keycode(SDL_Scancode sdl_key); + /** * \brief Converts an SDL mouse button code to the custom MouseButton type. * diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 87e86f8..1d6e79c 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -3,6 +3,7 @@ #include "../facade/SDLContext.h" #include "../types.h" #include "../util/OptionalRef.h" +#include "../api/Config.h" #include "System.h" @@ -37,8 +38,8 @@ private: //! Stores the last mouse button pressed. MouseButton last_mouse_button = MouseButton::NONE; - //! The maximum allowable distance between mouse down and mouse up to register as a click. - const int click_tolerance = 5; + //! The maximum allowable distance between mouse down and mouse up to register as a click. This can be changed using the Config. + int click_tolerance = Config::get_instance().click_tolerance.tolerance; /** * \brief Handles the mouse click event. diff --git a/src/example/button.cpp b/src/example/button.cpp index 00bdc28..f2e77f6 100644 --- a/src/example/button.cpp +++ b/src/example/button.cpp @@ -15,7 +15,6 @@ #include <crepe/system/InputSystem.h> #include <crepe/system/RenderSystem.h> #include <crepe/types.h> -#include <iostream> using namespace crepe; using namespace std; diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 94549a0..e9dc645 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -331,3 +331,31 @@ TEST_F(InputTest, WindowMoveTest) { event_manager.dispatch_events(); EXPECT_TRUE(callback_triggered); } +TEST_F(InputTest, KeyboardStateTest) { + SDLContext& sdl_context = this->mediator.sdl_context; + // Simulate pressing a key + SDL_Event key_down_event; + SDL_zero(key_down_event); + key_down_event.type = SDL_KEYDOWN; + key_down_event.key.keysym.scancode = SDL_SCANCODE_A; + key_down_event.key.keysym.sym = SDL_SCANCODE_A; + SDL_PushEvent(&key_down_event); + + // Check the keyboard state + auto keyboard_state = sdl_context.get_keyboard_state(); + + // Verify the state of the 'A' key + EXPECT_TRUE(keyboard_state[Keycode::A]); + + // Simulate releasing a key + SDL_Event key_up_event; + SDL_zero(key_up_event); + key_up_event.type = SDL_KEYUP; + key_up_event.key.keysym.scancode = SDL_SCANCODE_A; // Simulate releasing 'A' key + SDL_PushEvent(&key_up_event); + // Check the keyboard state again + keyboard_state = sdl_context.get_keyboard_state(); + + // Verify the state of the 'A' key + EXPECT_FALSE(keyboard_state[Keycode::A]); +} -- cgit v1.2.3 From f6633670594e04baf77c14399c9f3bdaa49aecea Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 15:29:51 +0100 Subject: make format --- src/crepe/api/Config.h | 1 - src/crepe/facade/SDLContext.cpp | 29 ++++++++++++++-------------- src/crepe/facade/SDLContext.h | 2 +- src/crepe/system/InputSystem.h | 2 +- src/test/InputTest.cpp | 42 ++++++++++++++++++++--------------------- 5 files changed, 37 insertions(+), 39 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 7b1a5ca..d2be3f3 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -91,7 +91,6 @@ public: //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. int tolerance = 5; } click_tolerance; - }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 1e8af41..4504b95 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -191,22 +191,21 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return LOOKUP_TABLE[sdl_key]; } std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) - std::array<bool, Keycode::NUM_KEYCODES> keyState{}; - SDL_PumpEvents(); - const Uint8 *current_state = SDL_GetKeyboardState(nullptr); - - for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); - - if (key != Keycode::NONE) { - keyState[key] = current_state[i] != 0; - } - } - - return keyState; -} + // Array to hold the key states (true if pressed, false if not) + std::array<bool, Keycode::NUM_KEYCODES> keyState{}; + SDL_PumpEvents(); + const Uint8 * current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); + + if (key != Keycode::NONE) { + keyState[key] = current_state[i] != 0; + } + } + return keyState; +} MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { static const std::array<MouseButton, 5> MOUSE_BUTTON_LOOKUP_TABLE = [] { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 5182dca..053aa59 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -165,7 +165,7 @@ private: * \return The corresponding `Keycode` value or `Keycode::NONE` if the key is unrecognized. */ Keycode sdl_to_keycode(SDL_Scancode sdl_key); - + /** * \brief Converts an SDL mouse button code to the custom MouseButton type. * diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 1d6e79c..5da8f32 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -1,9 +1,9 @@ #pragma once +#include "../api/Config.h" #include "../facade/SDLContext.h" #include "../types.h" #include "../util/OptionalRef.h" -#include "../api/Config.h" #include "System.h" diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index e9dc645..5150960 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -332,30 +332,30 @@ TEST_F(InputTest, WindowMoveTest) { EXPECT_TRUE(callback_triggered); } TEST_F(InputTest, KeyboardStateTest) { - SDLContext& sdl_context = this->mediator.sdl_context; - // Simulate pressing a key - SDL_Event key_down_event; - SDL_zero(key_down_event); - key_down_event.type = SDL_KEYDOWN; - key_down_event.key.keysym.scancode = SDL_SCANCODE_A; + SDLContext & sdl_context = this->mediator.sdl_context; + // Simulate pressing a key + SDL_Event key_down_event; + SDL_zero(key_down_event); + key_down_event.type = SDL_KEYDOWN; + key_down_event.key.keysym.scancode = SDL_SCANCODE_A; key_down_event.key.keysym.sym = SDL_SCANCODE_A; - SDL_PushEvent(&key_down_event); + SDL_PushEvent(&key_down_event); - // Check the keyboard state - auto keyboard_state = sdl_context.get_keyboard_state(); + // Check the keyboard state + auto keyboard_state = sdl_context.get_keyboard_state(); - // Verify the state of the 'A' key - EXPECT_TRUE(keyboard_state[Keycode::A]); + // Verify the state of the 'A' key + EXPECT_TRUE(keyboard_state[Keycode::A]); - // Simulate releasing a key - SDL_Event key_up_event; - SDL_zero(key_up_event); - key_up_event.type = SDL_KEYUP; - key_up_event.key.keysym.scancode = SDL_SCANCODE_A; // Simulate releasing 'A' key - SDL_PushEvent(&key_up_event); - // Check the keyboard state again - keyboard_state = sdl_context.get_keyboard_state(); + // Simulate releasing a key + SDL_Event key_up_event; + SDL_zero(key_up_event); + key_up_event.type = SDL_KEYUP; + key_up_event.key.keysym.scancode = SDL_SCANCODE_A; // Simulate releasing 'A' key + SDL_PushEvent(&key_up_event); + // Check the keyboard state again + keyboard_state = sdl_context.get_keyboard_state(); - // Verify the state of the 'A' key - EXPECT_FALSE(keyboard_state[Keycode::A]); + // Verify the state of the 'A' key + EXPECT_FALSE(keyboard_state[Keycode::A]); } -- cgit v1.2.3 From 923d66394610a756e58a977415810c2902b84c67 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 15:31:16 +0100 Subject: removed space coordinates --- src/crepe/api/Transform.h | 8 -------- 1 file changed, 8 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h index b63acaf..7ee6d65 100644 --- a/src/crepe/api/Transform.h +++ b/src/crepe/api/Transform.h @@ -13,14 +13,6 @@ namespace crepe { */ class Transform : public Component { public: - //! Specifies the coordinate space for transformations. - enum Space { - //! coordinates are relative to the active camera - HUD, - //! coordinates are relative to the game world - WORLD, - }; - Space coordinate_space = Space::WORLD; //! Translation (shift) vec2 position = {0, 0}; //! Rotation, in degrees clockwise -- cgit v1.2.3 From 69a7df392482884fc9dd2ce5012fdb028c37e469 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Mon, 9 Dec 2024 15:31:41 +0100 Subject: removed enter --- src/crepe/facade/SDLContext.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/crepe') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4504b95..8f6c02c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,7 +6,6 @@ #include <SDL2/SDL_render.h> #include <SDL2/SDL_surface.h> #include <SDL2/SDL_video.h> - #include <array> #include <cmath> #include <cstddef> -- cgit v1.2.3 From 73f8d5c558ebc0820ede241e64a876ff1c5ccefb Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Thu, 12 Dec 2024 07:57:24 +0100 Subject: seperat ints converted to float --- src/crepe/api/Button.cpp | 3 +- src/crepe/api/Button.h | 12 +------ src/crepe/api/Config.h | 4 +-- src/crepe/system/InputSystem.cpp | 77 ++++++++++++++++++---------------------- src/crepe/system/InputSystem.h | 10 +++--- src/test/InputTest.cpp | 4 +-- 6 files changed, 44 insertions(+), 66 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Button.cpp b/src/crepe/api/Button.cpp index 76f74f0..305922c 100644 --- a/src/crepe/api/Button.cpp +++ b/src/crepe/api/Button.cpp @@ -3,9 +3,8 @@ namespace crepe { Button::Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::function<void()> & on_click, bool is_toggle) + const std::function<void()> & on_click) : UIObject(id, dimensions, offset), - is_toggle(is_toggle), on_click(on_click) {} } // namespace crepe diff --git a/src/crepe/api/Button.h b/src/crepe/api/Button.h index 61b18d7..08f5dec 100644 --- a/src/crepe/api/Button.h +++ b/src/crepe/api/Button.h @@ -15,19 +15,11 @@ public: * \param id The unique ID of the game object associated with this button. * \param dimensions The width and height of the UIObject * \param offset The offset relative this GameObjects Transform - * \param is_toggle Optional flag to indicate if the button is a toggle button. Defaults to false. * \param on_click callback function that will be invoked when the button is clicked. */ Button(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, - const std::function<void()> & on_click, bool is_toggle = false); + const std::function<void()> & on_click); - /** - * \brief Indicates if the button is a toggle button (can be pressed and released). - * - * A toggle button allows for a pressed/released state, whereas a regular button - * typically only has an on-click state. - */ - bool is_toggle = false; // TODO: create separate toggle button class /** * \brief The callback function to be executed when the button is clicked. @@ -56,8 +48,6 @@ public: private: //! friend relation for is_pressed and hover variables friend class InputSystem; - //! Indicates whether the toggle button is pressed - bool is_pressed = false; //! Indicates whether the mouse is currently hovering over the button bool hover = false; diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index d2be3f3..324e639 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -89,8 +89,8 @@ public: //! Configuration for click tolerance. struct { //! The maximum number of pixels the mouse can move between MouseDown and MouseUp events to be considered a click. - int tolerance = 5; - } click_tolerance; + int click_tolerance = 5; + } input; }; } // namespace crepe diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index f5d8536..e76b1ec 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -2,7 +2,6 @@ #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" - #include "InputSystem.h" using namespace crepe; @@ -41,15 +40,15 @@ void InputSystem::update() { || event.event_type == SDLContext::EventType::MOUSEMOVE || event.event_type == SDLContext::EventType::MOUSEWHEEL) { - int adjusted_mouse_x = event.mouse_data.mouse_position.x + camera_origin.x; - int adjusted_mouse_y = event.mouse_data.mouse_position.y + camera_origin.y; - + ivec2 adjusted_mouse; + adjusted_mouse.x = event.mouse_data.mouse_position.x + camera_origin.x; + adjusted_mouse.y = event.mouse_data.mouse_position.y + camera_origin.y; // Check if the mouse is within the viewport bool mouse_in_viewport - = !(adjusted_mouse_x < camera_origin.x - || adjusted_mouse_x > camera_origin.x + current_cam.viewport_size.x - || adjusted_mouse_y < camera_origin.y - || adjusted_mouse_y > camera_origin.y + current_cam.viewport_size.y); + = !(adjusted_mouse.x < camera_origin.x + || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse.y < camera_origin.y + || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y); if (!mouse_in_viewport) continue; @@ -57,45 +56,44 @@ void InputSystem::update() { switch (event.event_type) { case SDLContext::EventType::MOUSEDOWN: event_mgr.queue_event<MousePressEvent>({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.mouse_data.mouse_button, }); - this->last_mouse_down_position = {adjusted_mouse_x, adjusted_mouse_y}; + this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y}; this->last_mouse_button = event.mouse_data.mouse_button; break; case SDLContext::EventType::MOUSEUP: { event_mgr.queue_event<MouseReleaseEvent>({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.mouse_data.mouse_button, }); - int delta_x = adjusted_mouse_x - this->last_mouse_down_position.x; - int delta_y = adjusted_mouse_y - this->last_mouse_down_position.y; + int delta_x = adjusted_mouse.x - this->last_mouse_down_position.x; + int delta_y = adjusted_mouse.y - this->last_mouse_down_position.y; if (this->last_mouse_button == event.mouse_data.mouse_button && std::abs(delta_x) <= click_tolerance && std::abs(delta_y) <= click_tolerance) { event_mgr.queue_event<MouseClickEvent>({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .button = event.mouse_data.mouse_button, }); - this->handle_click(event.mouse_data.mouse_button, adjusted_mouse_x, - adjusted_mouse_y); + this->handle_click(event.mouse_data.mouse_button, adjusted_mouse); } break; } case SDLContext::EventType::MOUSEMOVE: event_mgr.queue_event<MouseMoveEvent>({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .mouse_delta = event.mouse_data.rel_mouse_move, }); - this->handle_move(event, adjusted_mouse_x, adjusted_mouse_y); + this->handle_move(event, adjusted_mouse); break; case SDLContext::EventType::MOUSEWHEEL: event_mgr.queue_event<MouseScrollEvent>({ - .mouse_pos = {adjusted_mouse_x, adjusted_mouse_y}, + .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, .scroll_direction = event.mouse_data.scroll_direction, .scroll_delta = event.mouse_data.scroll_delta, }); @@ -148,54 +146,57 @@ void InputSystem::update() { } void InputSystem::handle_move(const SDLContext::EventData & event_data, - const int adjusted_mouse_x, const int adjusted_mouse_y) { + const ivec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); for (Button & button : buttons) { + if(!button.active) continue; RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(button.game_object_id); Transform & transform(transform_vec.front().get()); bool was_hovering = button.hover; - if (button.active - && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, + if (this->is_mouse_inside_button(mouse_pos, button, transform)) { button.hover = true; - if (!was_hovering && button.on_mouse_enter) { + if(!button.on_mouse_enter) continue; + if (!was_hovering) { button.on_mouse_enter(); } } else { button.hover = false; // Trigger the on_exit callback if the hover state just changed to false - if (was_hovering && button.on_mouse_exit) { + if(!button.on_mouse_exit) continue; + if (was_hovering) { button.on_mouse_exit(); } } } } -void InputSystem::handle_click(const MouseButton & mouse_button, const int adjusted_mouse_x, - const int adjusted_mouse_y) { +void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); for (Button & button : buttons) { + if(!button.active) continue; + if (!button.on_click) continue; RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(button.game_object_id); Transform & transform = transform_vec.front().get(); - - if (button.active - && this->is_mouse_inside_button(adjusted_mouse_x, adjusted_mouse_y, button, + + if (this->is_mouse_inside_button(mouse_pos, button, transform)) { - this->handle_button_press(button); + + button.on_click(); } } } -bool InputSystem::is_mouse_inside_button(const int mouse_x, const int mouse_y, +bool InputSystem::is_mouse_inside_button(const ivec2& mouse_pos, const Button & button, const Transform & transform) { int actual_x = transform.position.x + button.offset.x; int actual_y = transform.position.y + button.offset.y; @@ -204,17 +205,7 @@ bool InputSystem::is_mouse_inside_button(const int mouse_x, const int mouse_y, int half_height = button.dimensions.y / 2; // Check if the mouse is within the button's boundaries - return mouse_x >= actual_x - half_width && mouse_x <= actual_x + half_width - && mouse_y >= actual_y - half_height && mouse_y <= actual_y + half_height; + return mouse_pos.x >= actual_x - half_width && mouse_pos.x <= actual_x + half_width + && mouse_pos.y >= actual_y - half_height && mouse_pos.y <= actual_y + half_height; } -void InputSystem::handle_button_press(Button & button) { - if (button.is_toggle) { - if (!button.is_pressed && button.on_click) { - button.on_click(); - } - button.is_pressed = !button.is_pressed; - } else if (button.on_click) { - button.on_click(); - } -} diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 5da8f32..3703635 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -39,7 +39,7 @@ private: MouseButton last_mouse_button = MouseButton::NONE; //! The maximum allowable distance between mouse down and mouse up to register as a click. This can be changed using the Config. - int click_tolerance = Config::get_instance().click_tolerance.tolerance; + int click_tolerance = Config::get_instance().input.click_tolerance; /** * \brief Handles the mouse click event. @@ -49,8 +49,7 @@ private: * * This method processes the mouse click event and triggers the corresponding button action. */ - void handle_click(const MouseButton & mouse_button, const int world_mouse_x, - const int world_mouse_y); + void handle_click(const MouseButton & mouse_button,const ivec2& mouse_pos); /** * \brief Handles the mouse movement event. @@ -60,8 +59,7 @@ private: * * This method processes the mouse movement event and updates the button hover state. */ - void handle_move(const SDLContext::EventData & event_data, const int world_mouse_x, - const int world_mouse_y); + void handle_move(const SDLContext::EventData & event_data, const ivec2& mouse_pos); /** * \brief Checks if the mouse position is inside the bounds of the button. @@ -71,7 +69,7 @@ private: * \param transform The transform component of the button. * \return True if the mouse is inside the button, false otherwise. */ - bool is_mouse_inside_button(const int world_mouse_x, const int world_mouse_y, + bool is_mouse_inside_button(const ivec2& mouse_pos, const Button & button, const Transform & transform); /** diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 94549a0..a7058b2 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -227,7 +227,7 @@ TEST_F(InputTest, testButtonClick) { bool button_clicked = false; std::function<void()> on_click = [&]() { button_clicked = true; }; auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); + = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); bool hover = false; button.active = true; @@ -251,7 +251,7 @@ TEST_F(InputTest, testButtonHover) { bool button_clicked = false; std::function<void()> on_click = [&]() { button_clicked = true; }; auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); + = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); button.active = true; // Mouse not on button -- cgit v1.2.3 From 44cab6ad59d257d949112dcd4a9e0bdc9302e92b Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Thu, 12 Dec 2024 08:58:08 +0100 Subject: save --- src/crepe/facade/SDLContext.cpp | 144 +++++++++++++++++++++++---------------- src/crepe/facade/SDLContext.h | 19 ++++-- src/crepe/system/InputSystem.cpp | 53 +++++++------- src/test/EventTest.cpp | 26 +++---- 4 files changed, 140 insertions(+), 102 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4552605..75ad0e8 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,3 +1,4 @@ +#include <iostream> #include <SDL2/SDL.h> #include <SDL2/SDL_blendmode.h> #include <SDL2/SDL_image.h> @@ -383,59 +384,82 @@ ivec2 SDLContext::get_size(const Texture & ctx) { std::vector<SDLContext::EventData> SDLContext::get_events() { std::vector<SDLContext::EventData> event_list; SDL_Event event; + const CameraAuxiliaryData & cam = this->cam_aux_data; while (SDL_PollEvent(&event)) { ivec2 mouse_pos; mouse_pos.x = (event.button.x - cam.bar_size.x) / cam.render_scale.x; mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y; + std::cout << "SDL mousePos X: " << mouse_pos.x << std::endl; + std::cout << "SDL mousePos Y: " << mouse_pos.y << std::endl; switch (event.type) { case SDL_QUIT: - event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); + event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN}); break; case SDL_KEYDOWN: - event_list.push_back( - {SDLContext::EventType::KEYDOWN, - {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, - {}, - {}}); + { + + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::KEYDOWN; + transfer_event.data.key_data = KeyData{ + .key = sdl_to_keycode(event.key.keysym.scancode), + .key_repeat = event.key.repeat != 0, + }; + event_list.push_back(transfer_event); + } break; case SDL_KEYUP: - event_list.push_back({SDLContext::EventType::KEYUP, - {sdl_to_keycode(event.key.keysym.scancode), false}, - {}, - {}}); + { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::KEYUP; + transfer_event.data.key_data = KeyData{ + .key = sdl_to_keycode(event.key.keysym.scancode), + .key_repeat = false, + }; + event_list.push_back(transfer_event); + } break; case SDL_MOUSEBUTTONDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEDOWN, + { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::MOUSEDOWN; + transfer_event.data.mouse_data = MouseData{ .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); - break; - case SDL_MOUSEBUTTONUP: { - int x, y; - SDL_GetMouseState(&x, &y); - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEUP, + .mouse_position = mouse_pos, + }; + event_list.push_back(transfer_event); + + } break; + case SDL_MOUSEBUTTONUP: + { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::MOUSEUP; + transfer_event.data.mouse_data = MouseData{ .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); + .mouse_position = mouse_pos, + }; + event_list.push_back(transfer_event); + } break; case SDL_MOUSEMOTION: { - event_list.push_back( - EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, - .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::MOUSEMOVE; + transfer_event.data.mouse_data = MouseData{ + .mouse_position = mouse_pos, + .rel_mouse_move = {event.motion.xrel, event.motion.yrel}, + }; + event_list.push_back(transfer_event); } break; case SDL_MOUSEWHEEL: { - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, - // TODO: why is this needed? + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::MOUSEWHEEL; + transfer_event.data.mouse_data = MouseData{ + .mouse_position = mouse_pos, .scroll_direction = event.wheel.y < 0 ? -1 : 1, .scroll_delta = event.wheel.preciseY, - }); + }; + event_list.push_back(transfer_event); } break; } } @@ -446,35 +470,35 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { // Separate function for SDL_WINDOWEVENT subtypes void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, std::vector<SDLContext::EventData> & event_list) { - switch (window_event.event) { - case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_RESIZED: - event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, - {}, - {}, - {{}, {window_event.data1, window_event.data2}}}); - break; - case SDL_WINDOWEVENT_MOVED: - event_list.push_back({SDLContext::EventType::WINDOW_MOVE, - {}, - {}, - {{window_event.data1, window_event.data2}, {}}}); - break; - case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - break; - } + // switch (window_event.event) { + // case SDL_WINDOWEVENT_EXPOSED: + // event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + // break; + // case SDL_WINDOWEVENT_RESIZED: + // event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, + // {}, + // {}, + // {{}, {window_event.data1, window_event.data2}}}); + // break; + // case SDL_WINDOWEVENT_MOVED: + // event_list.push_back({SDLContext::EventType::WINDOW_MOVE, + // {}, + // {}, + // {{window_event.data1, window_event.data2}, {}}}); + // break; + // case SDL_WINDOWEVENT_MINIMIZED: + // event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + // break; + // case SDL_WINDOWEVENT_MAXIMIZED: + // event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + // break; + // case SDL_WINDOWEVENT_FOCUS_GAINED: + // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + // break; + // case SDL_WINDOWEVENT_FOCUS_LOST: + // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + // break; + // } } void SDLContext::set_color_texture(const Texture & texture, const Color & color) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 0a2456d..d7af226 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -105,10 +105,21 @@ public: }; //! EventData struct for passing event data from facade struct EventData { - SDLContext::EventType event_type = SDLContext::EventType::NONE; - KeyData key_data; - MouseData mouse_data; - WindowData window_data; + SDLContext::EventType event_type = SDLContext::EventType::NONE; + + union EventDataUnion { + KeyData key_data; + MouseData mouse_data; + WindowData window_data; + + EventDataUnion() {} + ~EventDataUnion() {} + } data; + + // Helper functions + // bool isKeyEvent() const { return event_type == SDLContext::EventType::KEYDOWN || event_type == SDLContext::EventType::KEYUP; } + // bool isMouseEvent() const { return event_type == SDLContext::EventType::MOUSEDOWN || event_type == SDLContext::EventType::MOUSEUP || event_type == SDLContext::EventType::MOUSEMOVE; } + // bool isWindowEvent() const { return event_type == SDLContext::EventType::WINDOW_MINIMIZE || event_type == SDLContext::EventType::WINDOW_RESIZE; } }; /** * \brief Retrieves the current state of the keyboard. diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 459feb3..32538e8 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,4 +1,4 @@ - +#include <iostream> #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" @@ -32,10 +32,10 @@ void InputSystem::update() { Transform & cam_transform = transform_vec.front().get(); ivec2 camera_origin; - camera_origin.y = cam_transform.position.y + current_cam.data.postion_offset.y - - (current_cam.viewport_size.y / 2); - camera_origin.x = cam_transform.position.x + current_cam.data.postion_offset.x - - (current_cam.viewport_size.x / 2); + int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x + - (current_cam.viewport_size.x / 2); + int camera_origin_y = cam_transform.position.y + current_cam.data.postion_offset.y + - (current_cam.viewport_size.y / 2); for (const SDLContext::EventData & event : event_list) { // Only calculate mouse coordinates for relevant events @@ -45,15 +45,17 @@ void InputSystem::update() { || event.event_type == SDLContext::EventType::MOUSEWHEEL) { ivec2 adjusted_mouse; - adjusted_mouse.x = event.mouse_data.mouse_position.x + camera_origin.x; - adjusted_mouse.y = event.mouse_data.mouse_position.y + camera_origin.y; + std::cout << "mousePos X: " << event.data.mouse_data.mouse_position.x << std::endl; + std::cout << "mousePos Y: " << event.data.mouse_data.mouse_position.y << std::endl; + int world_mouse_x = event.data.mouse_data.mouse_position.x + camera_origin_x; + int world_mouse_y = event.data.mouse_data.mouse_position.y + camera_origin_y; // Check if the mouse is within the viewport bool mouse_in_viewport - = !(adjusted_mouse.x < camera_origin.x - || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x - || adjusted_mouse.y < camera_origin.y - || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y); - + = !(world_mouse_x < camera_origin_x + || world_mouse_x > camera_origin_x + current_cam.viewport_size.x + || world_mouse_y < camera_origin_y + || world_mouse_y > camera_origin_y + current_cam.viewport_size.y); + std::cout << "in view " << mouse_in_viewport << std::endl; if (!mouse_in_viewport) continue; // Handle mouse-specific events @@ -61,28 +63,28 @@ void InputSystem::update() { case SDLContext::EventType::MOUSEDOWN: event_mgr.queue_event<MousePressEvent>({ .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.mouse_data.mouse_button, + .button = event.data.mouse_data.mouse_button, }); this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y}; - this->last_mouse_button = event.mouse_data.mouse_button; + this->last_mouse_button = event.data.mouse_data.mouse_button; break; case SDLContext::EventType::MOUSEUP: { event_mgr.queue_event<MouseReleaseEvent>({ .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.mouse_data.mouse_button, + .button = event.data.mouse_data.mouse_button, }); int delta_x = adjusted_mouse.x - this->last_mouse_down_position.x; int delta_y = adjusted_mouse.y - this->last_mouse_down_position.y; - if (this->last_mouse_button == event.mouse_data.mouse_button + if (this->last_mouse_button == event.data.mouse_data.mouse_button && std::abs(delta_x) <= click_tolerance && std::abs(delta_y) <= click_tolerance) { event_mgr.queue_event<MouseClickEvent>({ .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.mouse_data.mouse_button, + .button = event.data.mouse_data.mouse_button, }); - this->handle_click(event.mouse_data.mouse_button, adjusted_mouse); + this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse); } break; } @@ -90,7 +92,7 @@ void InputSystem::update() { case SDLContext::EventType::MOUSEMOVE: event_mgr.queue_event<MouseMoveEvent>({ .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .mouse_delta = event.mouse_data.rel_mouse_move, + .mouse_delta = event.data.mouse_data.rel_mouse_move, }); this->handle_move(event, adjusted_mouse); break; @@ -98,8 +100,8 @@ void InputSystem::update() { case SDLContext::EventType::MOUSEWHEEL: event_mgr.queue_event<MouseScrollEvent>({ .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .scroll_direction = event.mouse_data.scroll_direction, - .scroll_delta = event.mouse_data.scroll_delta, + .scroll_direction = event.data.mouse_data.scroll_direction, + .scroll_delta = event.data.mouse_data.scroll_delta, }); break; @@ -110,11 +112,12 @@ void InputSystem::update() { // Handle non-mouse events switch (event.event_type) { case SDLContext::EventType::KEYDOWN: + event_mgr.queue_event<KeyPressEvent>( - {.repeat = event.key_data.key_repeat, .key = event.key_data.key}); + {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); break; case SDLContext::EventType::KEYUP: - event_mgr.queue_event<KeyReleaseEvent>({.key = event.key_data.key}); + event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); break; case SDLContext::EventType::SHUTDOWN: event_mgr.queue_event<ShutDownEvent>({}); @@ -124,11 +127,11 @@ void InputSystem::update() { break; case SDLContext::EventType::WINDOW_RESIZE: event_mgr.queue_event<WindowResizeEvent>( - WindowResizeEvent{.dimensions = event.window_data.resize_dimension}); + WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); break; case SDLContext::EventType::WINDOW_MOVE: event_mgr.queue_event<WindowMoveEvent>( - {.delta_move = event.window_data.move_delta}); + {.delta_move = event.data.window_data.move_delta}); break; case SDLContext::EventType::WINDOW_MINIMIZE: event_mgr.queue_event<WindowMinimizeEvent>({}); diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp index f57a6de..f30f15a 100644 --- a/src/test/EventTest.cpp +++ b/src/test/EventTest.cpp @@ -56,7 +56,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) { event_mgr.subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL); MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; - EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, + event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); EXPECT_TRUE(triggered); @@ -74,7 +74,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) { event_mgr.subscribe<MouseClickEvent>(mouse_handler, test_channel); MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; - EventManager::get_instance().trigger_event<MouseClickEvent>(click_event, + event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); EXPECT_FALSE(triggered); @@ -106,8 +106,8 @@ TEST_F(EventManagerTest, EventManagerTest_callback_propagation) { // Test event MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; - event_manager.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL); - event_manager.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL); + event_mgr.subscribe<MouseClickEvent>(mouse_handler_true, EventManager::CHANNEL_ALL); + event_mgr.subscribe<MouseClickEvent>(mouse_handler_false, EventManager::CHANNEL_ALL); // Trigger event event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); @@ -137,15 +137,15 @@ TEST_F(EventManagerTest, EventManagerTest_queue_dispatch) { int test_channel = 1; EventHandler<MouseClickEvent> mouse_handler1 = [&](const MouseClickEvent & e) { triggered1 = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; // Allows propagation }; EventHandler<MouseClickEvent> mouse_handler2 = [&](const MouseClickEvent & e) { triggered2 = true; - EXPECT_EQ(e.mouse_x, 100); - EXPECT_EQ(e.mouse_y, 200); + EXPECT_EQ(e.mouse_pos.x, 100); + EXPECT_EQ(e.mouse_pos.y, 200); EXPECT_EQ(e.button, MouseButton::LEFT_MOUSE); return false; // Allows propagation }; @@ -153,9 +153,9 @@ TEST_F(EventManagerTest, EventManagerTest_queue_dispatch) { event_mgr.subscribe<MouseClickEvent>(mouse_handler2, test_channel); event_mgr.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}); + MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); event_mgr.queue_event<MouseClickEvent>( - MouseClickEvent{.mouse_x = 100, .mouse_y = 200, .button = MouseButton::LEFT_MOUSE}, + MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}, test_channel); event_mgr.dispatch_events(); EXPECT_TRUE(triggered1); @@ -189,7 +189,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { subscription_t handler2_id = event_mgr.subscribe<MouseClickEvent>(mouse_handler2); // Queue events - event_manager.queue_event<MouseClickEvent>( + event_mgr.queue_event<MouseClickEvent>( MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - both handlers should be triggered @@ -205,7 +205,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { event_mgr.unsubscribe(handler1_id); // Queue the same event again - event_manager.queue_event<MouseClickEvent>( + event_mgr.queue_event<MouseClickEvent>( MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - only handler 2 should be triggered, handler 1 should NOT @@ -220,7 +220,7 @@ TEST_F(EventManagerTest, EventManagerTest_unsubscribe) { event_mgr.unsubscribe(handler2_id); // Queue the event again - event_manager.queue_event<MouseClickEvent>( + event_mgr.queue_event<MouseClickEvent>( MouseClickEvent{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}); // Dispatch events - no handler should be triggered -- cgit v1.2.3 From afd81007153f05c8f8b42bcf08a8cdf8ce13a98c Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 15:32:07 +0100 Subject: updated particle emitter --- src/crepe/api/LoopManager.cpp | 1 + src/crepe/api/ParticleEmitter.h | 7 +++++-- src/crepe/system/ParticleSystem.cpp | 16 ++++++++++------ src/crepe/system/RenderSystem.cpp | 2 +- src/example/game.cpp | 21 +++++++++++++++++++++ src/example/rendering_particle.cpp | 23 +---------------------- 6 files changed, 39 insertions(+), 31 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp index b5e5ff7..7a78019 100644 --- a/src/crepe/api/LoopManager.cpp +++ b/src/crepe/api/LoopManager.cpp @@ -65,6 +65,7 @@ void LoopManager::fixed_update() { this->get_system<InputSystem>().update(); this->event_manager.dispatch_events(); this->get_system<ScriptSystem>().update(); + this->get_system<ParticleSystem>().update(); this->get_system<AISystem>().update(); this->get_system<PhysicsSystem>().update(); this->get_system<CollisionSystem>().update(); diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index 48c7625..cdea69a 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -5,6 +5,7 @@ #include "Component.h" #include "Particle.h" +#include "system/ParticleSystem.h" #include "types.h" namespace crepe { @@ -52,8 +53,6 @@ public: const unsigned int max_particles = 256; //! rate of particle emission per update (Lowest value = 0.001 any lower is ignored) float emission_rate = 1; - //! Saves time left over from last update event. - float spawn_accumulator = 0; //! min speed of the particles float min_speed = 1; //! min speed of the particles @@ -85,6 +84,10 @@ public: public: //! Configuration data for particle emission settings. Data data; +private: + //! Saves time left over from last update event. + friend ParticleSystem; + float spawn_accumulator = 0; }; } // namespace crepe diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 3befb03..941e502 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -1,3 +1,4 @@ +#include <chrono> #include <cmath> #include <cstdlib> #include <ctime> @@ -5,6 +6,7 @@ #include "../api/ParticleEmitter.h" #include "../api/Transform.h" #include "../manager/ComponentManager.h" +#include "../manager/LoopTimerManager.h" #include "ParticleSystem.h" @@ -12,10 +14,12 @@ using namespace crepe; void ParticleSystem::update() { // Get all emitters - - ComponentManager & mgr = this->mediator.component_manager; + const Mediator & mediator = this->mediator; + LoopTimerManager & loop_timer = mediator.loop_timer; + ComponentManager & mgr = mediator.component_manager; + float dt = std::chrono::duration<float>(loop_timer.get_scaled_fixed_delta_time()).count(); + RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>(); - double dt = LoopTimer::get_instance().get_fixed_delta_time(); for (ParticleEmitter & emitter : emitters) { // Get transform linked to emitter @@ -23,10 +27,10 @@ void ParticleSystem::update() { = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); // Emit particles based on emission_rate - emitter.data.spawn_accumulator = emitter.data.emission_rate * dt; - while (emitter.data.spawn_accumulator >= 1.0) { + emitter.spawn_accumulator = emitter.data.emission_rate * dt; + while (emitter.spawn_accumulator >= 1.0) { this->emit_particle(emitter, transform); - emitter.data.spawn_accumulator -= 1.0; + emitter.spawn_accumulator -= 1.0; } // Update all particles diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index afd9548..cc633e8 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -83,7 +83,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) bool rendering_particles = false; for (const ParticleEmitter & em : emitters) { - if (&em.data.sprite != &sprite) continue; + if (&em.sprite != &sprite) continue; rendering_particles = true; if (!em.active) continue; diff --git a/src/example/game.cpp b/src/example/game.cpp index 5361f3a..279648e 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -1,4 +1,5 @@ #include "api/CircleCollider.h" +#include "api/ParticleEmitter.h" #include "api/Scene.h" #include "manager/ComponentManager.h" #include "manager/Mediator.h" @@ -258,6 +259,26 @@ public: }) .active = false; + Asset img5{"asset/texture/square.png"}; + + + + GameObject particle = mgr.new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{.size = {5, 5},}); + auto & test = particle.add_component<ParticleEmitter>(particle_image,ParticleEmitter::Data{ + .position = {0, 0}, + .max_particles = 256, + .emission_rate = 50, + .min_speed = 10, + .max_speed = 20, + .min_angle = -20, + .max_angle = 20, + .begin_lifespan = 0, + .end_lifespan = 5, + } + ); + } string get_name() const { return "scene1"; } diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 13e625f..2b5c041 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -17,28 +17,7 @@ using namespace crepe; using namespace std; - -/* - auto & test = game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{ - .position = {0, 0}, - .max_particles = 10, - .emission_rate = 0.1, - .min_speed = 6, - .max_speed = 20, - .min_angle = -20, - .max_angle = 20, - .begin_lifespan = 0, - .end_lifespan = 60, - .force_over_time = vec2{0, 0}, - .boundary{ - .width = 1000, - .height = 1000, - .offset = vec2{0, 0}, - .reset_on_exit = false, - }, - .sprite = test_sprite, - }); - */ + class TestScene : public Scene { public: -- cgit v1.2.3 From 5b1c45c2c3bd695ee8d8b5baa4b1988e24596559 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 15:42:03 +0100 Subject: restore file --- src/crepe/system/CollisionSystem.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 0483693..952ed0a 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -290,6 +290,7 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; + // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; -- cgit v1.2.3 From d4b4a54f919872ef1295890cd36ac46d89a4426d Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 15:51:29 +0100 Subject: removed old code --- src/crepe/system/ParticleSystem.cpp | 2 -- src/crepe/system/ParticleSystem.h | 8 -------- 2 files changed, 10 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 941e502..204afaf 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -43,8 +43,6 @@ void ParticleSystem::update() { // Check if within boundary this->check_bounds(emitter, transform); } - - this->update_count = (this->update_count + 1) % this->MAX_UPDATE_COUNT; } void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & transform) { diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index 454b65f..95a2bd5 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -58,14 +58,6 @@ private: * \return Random speed. */ float generate_random_speed(float min_speed, float max_speed) const; - -private: - //! Counter to count updates to determine how many times emit_particle is - // called. - unsigned int update_count = 0; - //! Determines the lowest amount of emission rate (1000 = 0.001 = 1 particle per 1000 - // updates). - static constexpr unsigned int MAX_UPDATE_COUNT = 100; }; } // namespace crepe -- cgit v1.2.3 From 6e2aa75019a28c298454f50b7bfb0dca100e0936 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Thu, 12 Dec 2024 17:46:21 +0100 Subject: save --- src/crepe/api/Event.h | 5 ++ src/crepe/api/KeyCodes.h | 5 ++ src/crepe/facade/SDLContext.cpp | 122 ++++------------------------------------ src/crepe/facade/SDLContext.h | 107 ++++++++++++++++++++++++++++++++++- 4 files changed, 125 insertions(+), 114 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index d3e99af..d222e51 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -2,9 +2,12 @@ // TODO discussing the location of these events #include <string> +#include <unordered_map> + #include "KeyCodes.h" #include "types.h" + namespace crepe { /** @@ -22,6 +25,7 @@ public: //! The key that was pressed. Keycode key = Keycode::NONE; + keyboard_state_t keyboard_state; }; /** @@ -31,6 +35,7 @@ class KeyReleaseEvent : public Event { public: //! The key that was released. Keycode key = Keycode::NONE; + keyboard_state_t keyboard_state; }; /** diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index f704fbb..4a3bf57 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -1,4 +1,7 @@ #pragma once + +#include <unordered_map> + namespace crepe { //! Enumeration for mouse button inputs, including standard and extended buttons. enum class MouseButton { @@ -153,4 +156,6 @@ typedef enum { //! Not actually a key instead its the amount of keycodes there are for array indexing NUM_KEYCODES = 512, } Keycode; + +typedef std::unordered_map<Keycode, bool> keyboard_state_t; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 75ad0e8..d70a7bb 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -77,118 +77,14 @@ SDLContext::~SDLContext() { } Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { - static const std::array<Keycode, SDL_NUM_SCANCODES> LOOKUP_TABLE = [] { - std::array<Keycode, SDL_NUM_SCANCODES> table{}; - table.fill(Keycode::NONE); - - // Map all SDL scancodes to Keycodes - table[SDL_SCANCODE_SPACE] = Keycode::SPACE; - table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; - table[SDL_SCANCODE_COMMA] = Keycode::COMMA; - table[SDL_SCANCODE_MINUS] = Keycode::MINUS; - table[SDL_SCANCODE_PERIOD] = Keycode::PERIOD; - table[SDL_SCANCODE_SLASH] = Keycode::SLASH; - table[SDL_SCANCODE_0] = Keycode::D0; - table[SDL_SCANCODE_1] = Keycode::D1; - table[SDL_SCANCODE_2] = Keycode::D2; - table[SDL_SCANCODE_3] = Keycode::D3; - table[SDL_SCANCODE_4] = Keycode::D4; - table[SDL_SCANCODE_5] = Keycode::D5; - table[SDL_SCANCODE_6] = Keycode::D6; - table[SDL_SCANCODE_7] = Keycode::D7; - table[SDL_SCANCODE_8] = Keycode::D8; - table[SDL_SCANCODE_9] = Keycode::D9; - table[SDL_SCANCODE_SEMICOLON] = Keycode::SEMICOLON; - table[SDL_SCANCODE_EQUALS] = Keycode::EQUAL; - table[SDL_SCANCODE_A] = Keycode::A; - table[SDL_SCANCODE_B] = Keycode::B; - table[SDL_SCANCODE_C] = Keycode::C; - table[SDL_SCANCODE_D] = Keycode::D; - table[SDL_SCANCODE_E] = Keycode::E; - table[SDL_SCANCODE_F] = Keycode::F; - table[SDL_SCANCODE_G] = Keycode::G; - table[SDL_SCANCODE_H] = Keycode::H; - table[SDL_SCANCODE_I] = Keycode::I; - table[SDL_SCANCODE_J] = Keycode::J; - table[SDL_SCANCODE_K] = Keycode::K; - table[SDL_SCANCODE_L] = Keycode::L; - table[SDL_SCANCODE_M] = Keycode::M; - table[SDL_SCANCODE_N] = Keycode::N; - table[SDL_SCANCODE_O] = Keycode::O; - table[SDL_SCANCODE_P] = Keycode::P; - table[SDL_SCANCODE_Q] = Keycode::Q; - table[SDL_SCANCODE_R] = Keycode::R; - table[SDL_SCANCODE_S] = Keycode::S; - table[SDL_SCANCODE_T] = Keycode::T; - table[SDL_SCANCODE_U] = Keycode::U; - table[SDL_SCANCODE_V] = Keycode::V; - table[SDL_SCANCODE_W] = Keycode::W; - table[SDL_SCANCODE_X] = Keycode::X; - table[SDL_SCANCODE_Y] = Keycode::Y; - table[SDL_SCANCODE_Z] = Keycode::Z; - table[SDL_SCANCODE_LEFTBRACKET] = Keycode::LEFT_BRACKET; - table[SDL_SCANCODE_BACKSLASH] = Keycode::BACKSLASH; - table[SDL_SCANCODE_RIGHTBRACKET] = Keycode::RIGHT_BRACKET; - table[SDL_SCANCODE_GRAVE] = Keycode::GRAVE_ACCENT; - table[SDL_SCANCODE_ESCAPE] = Keycode::ESCAPE; - table[SDL_SCANCODE_RETURN] = Keycode::ENTER; - table[SDL_SCANCODE_TAB] = Keycode::TAB; - table[SDL_SCANCODE_BACKSPACE] = Keycode::BACKSPACE; - table[SDL_SCANCODE_INSERT] = Keycode::INSERT; - table[SDL_SCANCODE_DELETE] = Keycode::DELETE; - table[SDL_SCANCODE_RIGHT] = Keycode::RIGHT; - table[SDL_SCANCODE_LEFT] = Keycode::LEFT; - table[SDL_SCANCODE_DOWN] = Keycode::DOWN; - table[SDL_SCANCODE_UP] = Keycode::UP; - table[SDL_SCANCODE_PAGEUP] = Keycode::PAGE_UP; - table[SDL_SCANCODE_PAGEDOWN] = Keycode::PAGE_DOWN; - table[SDL_SCANCODE_HOME] = Keycode::HOME; - table[SDL_SCANCODE_END] = Keycode::END; - table[SDL_SCANCODE_CAPSLOCK] = Keycode::CAPS_LOCK; - table[SDL_SCANCODE_SCROLLLOCK] = Keycode::SCROLL_LOCK; - table[SDL_SCANCODE_NUMLOCKCLEAR] = Keycode::NUM_LOCK; - table[SDL_SCANCODE_PRINTSCREEN] = Keycode::PRINT_SCREEN; - table[SDL_SCANCODE_PAUSE] = Keycode::PAUSE; - table[SDL_SCANCODE_F1] = Keycode::F1; - table[SDL_SCANCODE_F2] = Keycode::F2; - table[SDL_SCANCODE_F3] = Keycode::F3; - table[SDL_SCANCODE_F4] = Keycode::F4; - table[SDL_SCANCODE_F5] = Keycode::F5; - table[SDL_SCANCODE_F6] = Keycode::F6; - table[SDL_SCANCODE_F7] = Keycode::F7; - table[SDL_SCANCODE_F8] = Keycode::F8; - table[SDL_SCANCODE_F9] = Keycode::F9; - table[SDL_SCANCODE_F10] = Keycode::F10; - table[SDL_SCANCODE_F11] = Keycode::F11; - table[SDL_SCANCODE_F12] = Keycode::F12; - table[SDL_SCANCODE_KP_0] = Keycode::KP0; - table[SDL_SCANCODE_KP_1] = Keycode::KP1; - table[SDL_SCANCODE_KP_2] = Keycode::KP2; - table[SDL_SCANCODE_KP_3] = Keycode::KP3; - table[SDL_SCANCODE_KP_4] = Keycode::KP4; - table[SDL_SCANCODE_KP_5] = Keycode::KP5; - table[SDL_SCANCODE_KP_6] = Keycode::KP6; - table[SDL_SCANCODE_KP_7] = Keycode::KP7; - table[SDL_SCANCODE_KP_8] = Keycode::KP8; - table[SDL_SCANCODE_KP_9] = Keycode::KP9; - table[SDL_SCANCODE_LSHIFT] = Keycode::LEFT_SHIFT; - table[SDL_SCANCODE_LCTRL] = Keycode::LEFT_CONTROL; - table[SDL_SCANCODE_LALT] = Keycode::LEFT_ALT; - table[SDL_SCANCODE_LGUI] = Keycode::LEFT_SUPER; - table[SDL_SCANCODE_RSHIFT] = Keycode::RIGHT_SHIFT; - table[SDL_SCANCODE_RCTRL] = Keycode::RIGHT_CONTROL; - table[SDL_SCANCODE_RALT] = Keycode::RIGHT_ALT; - table[SDL_SCANCODE_RGUI] = Keycode::RIGHT_SUPER; - table[SDL_SCANCODE_MENU] = Keycode::MENU; + auto it = LOOKUP_TABLE.find(sdl_key); + if (it != LOOKUP_TABLE.end()) { + return it->second; + } - return table; - }(); - if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { - return Keycode::NONE; - } - return LOOKUP_TABLE[sdl_key]; + return Keycode::NONE; } -std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { +keyboard_state_t SDLContext::get_keyboard_state() { // Array to hold the key states (true if pressed, false if not) std::array<bool, Keycode::NUM_KEYCODES> keyState{}; SDL_PumpEvents(); @@ -198,11 +94,11 @@ std::array<bool, Keycode::NUM_KEYCODES> SDLContext::get_keyboard_state() { Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); if (key != Keycode::NONE) { - keyState[key] = current_state[i] != 0; + keyboard_state[key] = current_state[i] != 0; } } - return keyState; + return keyboard_state; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -403,6 +299,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { transfer_event.data.key_data = KeyData{ .key = sdl_to_keycode(event.key.keysym.scancode), .key_repeat = event.key.repeat != 0, + .keyboard_state = this->get_keyboard_state(), }; event_list.push_back(transfer_event); } @@ -414,6 +311,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { transfer_event.data.key_data = KeyData{ .key = sdl_to_keycode(event.key.keysym.scancode), .key_repeat = false, + .keyboard_state = this->get_keyboard_state(), }; event_list.push_back(transfer_event); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index d7af226..feb51f4 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -10,6 +10,7 @@ #include <functional> #include <memory> #include <string> +#include <unordered_map> #include "api/Camera.h" #include "api/Color.h" @@ -129,11 +130,11 @@ public: * specific key defined in the `Keycode` enum, and the value indicates whether * the key is currently pressed (true) or not pressed (false). * - * \return A `std::array<bool, Keycode::NUM_KEYCODES>` representing the state of + * \return A `keyboard_state_t` representing the state of * each key on the keyboard, where `true` means the key is pressed, and * `false` means it is not pressed. */ - std::array<bool, Keycode::NUM_KEYCODES> get_keyboard_state(); + keyboard_state_t get_keyboard_state(); /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -294,6 +295,108 @@ private: * - this is defined in this class because get_events() needs this information aswell */ CameraAuxiliaryData cam_aux_data; +private: + keyboard_state_t keyboard_state; + const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = { + {SDL_SCANCODE_SPACE, Keycode::SPACE}, + {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, + {SDL_SCANCODE_COMMA, Keycode::COMMA}, + {SDL_SCANCODE_MINUS, Keycode::MINUS}, + {SDL_SCANCODE_PERIOD, Keycode::PERIOD}, + {SDL_SCANCODE_SLASH, Keycode::SLASH}, + {SDL_SCANCODE_0, Keycode::D0}, + {SDL_SCANCODE_1, Keycode::D1}, + {SDL_SCANCODE_2, Keycode::D2}, + {SDL_SCANCODE_3, Keycode::D3}, + {SDL_SCANCODE_4, Keycode::D4}, + {SDL_SCANCODE_5, Keycode::D5}, + {SDL_SCANCODE_6, Keycode::D6}, + {SDL_SCANCODE_7, Keycode::D7}, + {SDL_SCANCODE_8, Keycode::D8}, + {SDL_SCANCODE_9, Keycode::D9}, + {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON}, + {SDL_SCANCODE_EQUALS, Keycode::EQUAL}, + {SDL_SCANCODE_A, Keycode::A}, + {SDL_SCANCODE_B, Keycode::B}, + {SDL_SCANCODE_C, Keycode::C}, + {SDL_SCANCODE_D, Keycode::D}, + {SDL_SCANCODE_E, Keycode::E}, + {SDL_SCANCODE_F, Keycode::F}, + {SDL_SCANCODE_G, Keycode::G}, + {SDL_SCANCODE_H, Keycode::H}, + {SDL_SCANCODE_I, Keycode::I}, + {SDL_SCANCODE_J, Keycode::J}, + {SDL_SCANCODE_K, Keycode::K}, + {SDL_SCANCODE_L, Keycode::L}, + {SDL_SCANCODE_M, Keycode::M}, + {SDL_SCANCODE_N, Keycode::N}, + {SDL_SCANCODE_O, Keycode::O}, + {SDL_SCANCODE_P, Keycode::P}, + {SDL_SCANCODE_Q, Keycode::Q}, + {SDL_SCANCODE_R, Keycode::R}, + {SDL_SCANCODE_S, Keycode::S}, + {SDL_SCANCODE_T, Keycode::T}, + {SDL_SCANCODE_U, Keycode::U}, + {SDL_SCANCODE_V, Keycode::V}, + {SDL_SCANCODE_W, Keycode::W}, + {SDL_SCANCODE_X, Keycode::X}, + {SDL_SCANCODE_Y, Keycode::Y}, + {SDL_SCANCODE_Z, Keycode::Z}, + {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET}, + {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH}, + {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET}, + {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT}, + {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE}, + {SDL_SCANCODE_RETURN, Keycode::ENTER}, + {SDL_SCANCODE_TAB, Keycode::TAB}, + {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE}, + {SDL_SCANCODE_INSERT, Keycode::INSERT}, + {SDL_SCANCODE_DELETE, Keycode::DELETE}, + {SDL_SCANCODE_RIGHT, Keycode::RIGHT}, + {SDL_SCANCODE_LEFT, Keycode::LEFT}, + {SDL_SCANCODE_DOWN, Keycode::DOWN}, + {SDL_SCANCODE_UP, Keycode::UP}, + {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP}, + {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN}, + {SDL_SCANCODE_HOME, Keycode::HOME}, + {SDL_SCANCODE_END, Keycode::END}, + {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK}, + {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK}, + {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK}, + {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN}, + {SDL_SCANCODE_PAUSE, Keycode::PAUSE}, + {SDL_SCANCODE_F1, Keycode::F1}, + {SDL_SCANCODE_F2, Keycode::F2}, + {SDL_SCANCODE_F3, Keycode::F3}, + {SDL_SCANCODE_F4, Keycode::F4}, + {SDL_SCANCODE_F5, Keycode::F5}, + {SDL_SCANCODE_F6, Keycode::F6}, + {SDL_SCANCODE_F7, Keycode::F7}, + {SDL_SCANCODE_F8, Keycode::F8}, + {SDL_SCANCODE_F9, Keycode::F9}, + {SDL_SCANCODE_F10, Keycode::F10}, + {SDL_SCANCODE_F11, Keycode::F11}, + {SDL_SCANCODE_F12, Keycode::F12}, + {SDL_SCANCODE_KP_0, Keycode::KP0}, + {SDL_SCANCODE_KP_1, Keycode::KP1}, + {SDL_SCANCODE_KP_2, Keycode::KP2}, + {SDL_SCANCODE_KP_3, Keycode::KP3}, + {SDL_SCANCODE_KP_4, Keycode::KP4}, + {SDL_SCANCODE_KP_5, Keycode::KP5}, + {SDL_SCANCODE_KP_6, Keycode::KP6}, + {SDL_SCANCODE_KP_7, Keycode::KP7}, + {SDL_SCANCODE_KP_8, Keycode::KP8}, + {SDL_SCANCODE_KP_9, Keycode::KP9}, + {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT}, + {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL}, + {SDL_SCANCODE_LALT, Keycode::LEFT_ALT}, + {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER}, + {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT}, + {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL}, + {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT}, + {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER}, + {SDL_SCANCODE_MENU, Keycode::MENU} + }; }; } // namespace crepe -- cgit v1.2.3 From 9e1c0d08a8e1813799cf5002562d3f503524d718 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 18:14:08 +0100 Subject: updated comment --- src/crepe/api/ParticleEmitter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe') diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index cdea69a..1251a30 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -51,7 +51,7 @@ public: vec2 position; //! maximum number of particles const unsigned int max_particles = 256; - //! rate of particle emission per update (Lowest value = 0.001 any lower is ignored) + //! rate of particle emission per second float emission_rate = 1; //! min speed of the particles float min_speed = 1; -- cgit v1.2.3 From 1e42d6669b462a3d1490788d3b20141d15c881db Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 18:14:47 +0100 Subject: update comment --- src/crepe/api/ParticleEmitter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index 1251a30..cc54ffb 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -61,9 +61,9 @@ public: float min_angle = 0; //! max angle of particle emission float max_angle = 0; - //! begin Lifespan of particle (only visual) + //! begin Lifespan of particle in seconds (only visual) float begin_lifespan = 0.0; - //! end Lifespan of particle + //! end Lifespan of particle in seconds float end_lifespan = 10.0; //! force over time (physics) vec2 force_over_time; -- cgit v1.2.3 From bef438ff7790acbe2dc376097e1782e60356bf45 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 18:25:11 +0100 Subject: changed get dt --- src/crepe/system/ParticleSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 204afaf..a58edf0 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -17,7 +17,7 @@ void ParticleSystem::update() { const Mediator & mediator = this->mediator; LoopTimerManager & loop_timer = mediator.loop_timer; ComponentManager & mgr = mediator.component_manager; - float dt = std::chrono::duration<float>(loop_timer.get_scaled_fixed_delta_time()).count(); + float dt = loop_timer.get_scaled_fixed_delta_time(); RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>(); -- cgit v1.2.3 From feb27ebdc4086dec62e45e3a6c83bdd021568dd5 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 18:47:18 +0100 Subject: reverted dt --- src/crepe/system/ParticleSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index a58edf0..85b8248 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -17,7 +17,7 @@ void ParticleSystem::update() { const Mediator & mediator = this->mediator; LoopTimerManager & loop_timer = mediator.loop_timer; ComponentManager & mgr = mediator.component_manager; - float dt = loop_timer.get_scaled_fixed_delta_time(); + float dt = loop_timer.get_scaled_fixed_delta_time().count(); RefVector<ParticleEmitter> emitters = mgr.get_components_by_type<ParticleEmitter>(); -- cgit v1.2.3 From 927aab8cf424d1f3bf25056ce4b4126ce9f4edab Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 18:49:50 +0100 Subject: reverted --- src/crepe/system/CollisionSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 952ed0a..44a0431 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -290,7 +290,7 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; - + // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; -- cgit v1.2.3 From d3a04fb1e8b119017375caab74c43674006a7348 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Thu, 12 Dec 2024 22:04:49 +0100 Subject: broken particle test --- src/crepe/api/ParticleEmitter.cpp | 2 +- src/crepe/api/ParticleEmitter.h | 10 ++++++---- src/crepe/system/ParticleSystem.cpp | 6 +++--- src/crepe/system/RenderSystem.cpp | 2 +- src/test/ParticleTest.cpp | 37 +++++++++++++++++++++---------------- 5 files changed, 32 insertions(+), 25 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp index 1cfdceb..1e9cfaa 100644 --- a/src/crepe/api/ParticleEmitter.cpp +++ b/src/crepe/api/ParticleEmitter.cpp @@ -7,6 +7,6 @@ ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & : Component(game_object_id), sprite(sprite), data(data) { for (size_t i = 0; i < this->data.max_particles; i++) { - this->data.particles.emplace_back(); + this->particles.emplace_back(); } } diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index cc54ffb..e0b117a 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -3,9 +3,11 @@ #include <cmath> #include <vector> +#include "system/ParticleSystem.h" +#include "system/RenderSystem.h" + #include "Component.h" #include "Particle.h" -#include "system/ParticleSystem.h" #include "types.h" namespace crepe { @@ -69,9 +71,6 @@ public: vec2 force_over_time; //! particle boundary Boundary boundary; - //! collection of particles - std::vector<Particle> particles; - }; public: @@ -87,7 +86,10 @@ public: private: //! Saves time left over from last update event. friend ParticleSystem; + friend RenderSystem; float spawn_accumulator = 0; + //! collection of particles + std::vector<Particle> particles; }; } // namespace crepe diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 85b8248..a56de60 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -34,7 +34,7 @@ void ParticleSystem::update() { } // Update all particles - for (Particle & particle : emitter.data.particles) { + for (Particle & particle : emitter.particles) { if (particle.active) { particle.update(dt); } @@ -57,7 +57,7 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & vec2 velocity = {random_speed * std::cos(angle_radians), random_speed * std::sin(angle_radians)}; - for (Particle & particle : emitter.data.particles) { + for (Particle & particle : emitter.particles) { if (!particle.active) { particle.reset(emitter.data.end_lifespan, initial_position, velocity, random_angle); @@ -76,7 +76,7 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t const float TOP = offset.y - half_height; const float BOTTOM = offset.y + half_height; - for (Particle & particle : emitter.data.particles) { + for (Particle & particle : emitter.particles) { const vec2 & position = particle.position; bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP && position.y <= BOTTOM); diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index cc633e8..505433a 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -87,7 +87,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) rendering_particles = true; if (!em.active) continue; - for (const Particle & p : em.data.particles) { + for (const Particle & p : em.particles) { if (!p.active) continue; ctx.draw(SDLContext::RenderContext{ diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index 9112a3f..70534f3 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -11,10 +11,14 @@ #include <gtest/gtest.h> #include <math.h> +#define protected public +#define private public + using namespace std; using namespace std::chrono_literals; using namespace crepe; + class ParticlesTest : public ::testing::Test { Mediator m; @@ -57,6 +61,7 @@ public: }, .sprite = test_sprite, }); + } transforms = mgr.get_components_by_id<Transform>(0); Transform & transform = transforms.front().get(); @@ -76,7 +81,7 @@ public: emitter.data.end_lifespan = 0; emitter.data.force_over_time = vec2{0, 0}; emitter.data.boundary = {0, 0, vec2{0, 0}, false}; - for (auto & particle : emitter.data.particles) { + for (auto & particle : emitter.particles) { particle.active = false; } } @@ -95,19 +100,19 @@ TEST_F(ParticlesTest, spawnParticle) { emitter.data.max_angle = 10; particle_system.update(); //check if nothing happend - EXPECT_EQ(emitter.data.particles[0].active, false); + EXPECT_EQ(emitter.particles[0].active, false); emitter.data.emission_rate = 1; //check particle spawnes particle_system.update(); - EXPECT_EQ(emitter.data.particles[0].active, true); + EXPECT_EQ(emitter.particles[0].active, true); particle_system.update(); - EXPECT_EQ(emitter.data.particles[1].active, true); + EXPECT_EQ(emitter.particles[1].active, true); particle_system.update(); - EXPECT_EQ(emitter.data.particles[2].active, true); + EXPECT_EQ(emitter.particles[2].active, true); particle_system.update(); - EXPECT_EQ(emitter.data.particles[3].active, true); + EXPECT_EQ(emitter.particles[3].active, true); - for (auto & particle : emitter.data.particles) { + for (auto & particle : emitter.particles) { // Check velocity range EXPECT_GE(particle.velocity.x, emitter.data.min_speed); // Speed should be greater than or equal to min_speed @@ -139,7 +144,7 @@ TEST_F(ParticlesTest, moveParticleHorizontal) { emitter.data.emission_rate = 1; for (int a = 1; a < emitter.data.boundary.width / 2; a++) { particle_system.update(); - EXPECT_EQ(emitter.data.particles[0].position.x, a); + EXPECT_EQ(emitter.particles[0].position.x, a); } } @@ -157,7 +162,7 @@ TEST_F(ParticlesTest, moveParticleVertical) { emitter.data.emission_rate = 1; for (int a = 1; a < emitter.data.boundary.width / 2; a++) { particle_system.update(); - EXPECT_EQ(emitter.data.particles[0].position.y, a); + EXPECT_EQ(emitter.particles[0].position.y, a); } } @@ -177,7 +182,7 @@ TEST_F(ParticlesTest, boundaryParticleReset) { for (int a = 0; a < emitter.data.boundary.width / 2 + 1; a++) { particle_system.update(); } - EXPECT_EQ(emitter.data.particles[0].active, false); + EXPECT_EQ(emitter.particles[0].active, false); } TEST_F(ParticlesTest, boundaryParticleStop) { @@ -197,12 +202,12 @@ TEST_F(ParticlesTest, boundaryParticleStop) { particle_system.update(); } const double TOLERANCE = 0.01; - EXPECT_NEAR(emitter.data.particles[0].velocity.x, 0, TOLERANCE); - EXPECT_NEAR(emitter.data.particles[0].velocity.y, 0, TOLERANCE); - if (emitter.data.particles[0].velocity.x != 0) - EXPECT_NEAR(std::abs(emitter.data.particles[0].position.x), + EXPECT_NEAR(emitter.particles[0].velocity.x, 0, TOLERANCE); + EXPECT_NEAR(emitter.particles[0].velocity.y, 0, TOLERANCE); + if (emitter.particles[0].velocity.x != 0) + EXPECT_NEAR(std::abs(emitter.particles[0].position.x), emitter.data.boundary.height / 2, TOLERANCE); - if (emitter.data.particles[0].velocity.y != 0) - EXPECT_NEAR(std::abs(emitter.data.particles[0].position.y), + if (emitter.particles[0].velocity.y != 0) + EXPECT_NEAR(std::abs(emitter.particles[0].position.y), emitter.data.boundary.width / 2, TOLERANCE); } -- cgit v1.2.3 From 193d5bf4d9577e63202cec45b21ed85a76a89f09 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Fri, 13 Dec 2024 08:16:48 +0100 Subject: keyboard state implemented --- src/crepe/api/Event.h | 4 ---- src/crepe/api/KeyCodes.h | 2 +- src/crepe/facade/SDLContext.cpp | 10 ++++------ src/crepe/facade/SDLContext.h | 12 ++++-------- 4 files changed, 9 insertions(+), 19 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index d222e51..66dd0cc 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -2,8 +2,6 @@ // TODO discussing the location of these events #include <string> -#include <unordered_map> - #include "KeyCodes.h" #include "types.h" @@ -25,7 +23,6 @@ public: //! The key that was pressed. Keycode key = Keycode::NONE; - keyboard_state_t keyboard_state; }; /** @@ -35,7 +32,6 @@ class KeyReleaseEvent : public Event { public: //! The key that was released. Keycode key = Keycode::NONE; - keyboard_state_t keyboard_state; }; /** diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index 4a3bf57..fa0d17c 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -157,5 +157,5 @@ typedef enum { NUM_KEYCODES = 512, } Keycode; -typedef std::unordered_map<Keycode, bool> keyboard_state_t; + } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index d70a7bb..6e47561 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -84,7 +84,7 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return Keycode::NONE; } -keyboard_state_t SDLContext::get_keyboard_state() { +void SDLContext::update_keyboard_state() { // Array to hold the key states (true if pressed, false if not) std::array<bool, Keycode::NUM_KEYCODES> keyState{}; SDL_PumpEvents(); @@ -94,11 +94,10 @@ keyboard_state_t SDLContext::get_keyboard_state() { Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); if (key != Keycode::NONE) { - keyboard_state[key] = current_state[i] != 0; + this->keyboard_state[key] = current_state[i] != 0; } } - return keyboard_state; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -293,25 +292,24 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { break; case SDL_KEYDOWN: { - + this->update_keyboard_state(); EventData transfer_event; transfer_event.event_type = SDLContext::EventType::KEYDOWN; transfer_event.data.key_data = KeyData{ .key = sdl_to_keycode(event.key.keysym.scancode), .key_repeat = event.key.repeat != 0, - .keyboard_state = this->get_keyboard_state(), }; event_list.push_back(transfer_event); } break; case SDL_KEYUP: { + this->update_keyboard_state(); EventData transfer_event; transfer_event.event_type = SDLContext::EventType::KEYUP; transfer_event.data.key_data = KeyData{ .key = sdl_to_keycode(event.key.keysym.scancode), .key_repeat = false, - .keyboard_state = this->get_keyboard_state(), }; event_list.push_back(transfer_event); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index feb51f4..b10bcfe 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -125,16 +125,12 @@ public: /** * \brief Retrieves the current state of the keyboard. * - * This method returns the state of all keys on the keyboard, represented as a - * `std::array` of boolean values. Each element of the array corresponds to a + * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a * specific key defined in the `Keycode` enum, and the value indicates whether * the key is currently pressed (true) or not pressed (false). - * - * \return A `keyboard_state_t` representing the state of - * each key on the keyboard, where `true` means the key is pressed, and - * `false` means it is not pressed. + * */ - keyboard_state_t get_keyboard_state(); + void update_keyboard_state(); /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -296,7 +292,7 @@ private: */ CameraAuxiliaryData cam_aux_data; private: - keyboard_state_t keyboard_state; + std::unordered_map<Keycode, bool> keyboard_state; const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = { {SDL_SCANCODE_SPACE, Keycode::SPACE}, {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, -- cgit v1.2.3 From 2b3659c8c5dace0ff9ff9cb8b9421f7f3f890218 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Fri, 13 Dec 2024 09:15:56 +0100 Subject: added window events back to code and function cleanup --- src/crepe/api/Event.h | 10 +- src/crepe/api/KeyCodes.h | 2 - src/crepe/facade/SDLContext.cpp | 72 ++++++------ src/crepe/facade/SDLContext.h | 5 - src/crepe/system/InputSystem.cpp | 239 ++++++++++++++++++++------------------- src/crepe/system/InputSystem.h | 37 ++++-- src/test/InputTest.cpp | 52 +-------- 7 files changed, 196 insertions(+), 221 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 66dd0cc..17ae809 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -40,7 +40,7 @@ public: class MousePressEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was pressed. MouseButton button = MouseButton::NONE; @@ -52,7 +52,7 @@ public: class MouseClickEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was clicked. MouseButton button = MouseButton::NONE; @@ -64,7 +64,7 @@ public: class MouseReleaseEvent : public Event { public: //! mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The mouse button that was released. MouseButton button = MouseButton::NONE; @@ -76,7 +76,7 @@ public: class MouseMoveEvent : public Event { public: //! new mouse position - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! The change in mouse position relative to the last position (in pixels). ivec2 mouse_delta = {0, 0}; }; @@ -87,7 +87,7 @@ public: class MouseScrollEvent : public Event { public: //! mouse position when the scroll happened. - ivec2 mouse_pos = {0, 0}; + vec2 mouse_pos = {0, 0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; //! scroll amount in y axis (from and away from the person). diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index fa0d17c..a9141e2 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -153,8 +153,6 @@ typedef enum { RIGHT_SUPER = 347, /// \} MENU = 348, //!< Menu key. - //! Not actually a key instead its the amount of keycodes there are for array indexing - NUM_KEYCODES = 512, } Keycode; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6e47561..7c7d58e 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,4 +1,3 @@ -#include <iostream> #include <SDL2/SDL.h> #include <SDL2/SDL_blendmode.h> #include <SDL2/SDL_image.h> @@ -86,7 +85,6 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { } void SDLContext::update_keyboard_state() { // Array to hold the key states (true if pressed, false if not) - std::array<bool, Keycode::NUM_KEYCODES> keyState{}; SDL_PumpEvents(); const Uint8 * current_state = SDL_GetKeyboardState(nullptr); @@ -284,8 +282,6 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { ivec2 mouse_pos; mouse_pos.x = (event.button.x - cam.bar_size.x) / cam.render_scale.x; mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y; - std::cout << "SDL mousePos X: " << mouse_pos.x << std::endl; - std::cout << "SDL mousePos Y: " << mouse_pos.y << std::endl; switch (event.type) { case SDL_QUIT: event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN}); @@ -357,44 +353,52 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { }; event_list.push_back(transfer_event); } break; + case SDL_WINDOWEVENT: + handle_window_event(event.window, event_list); + break; } } return event_list; } -// Separate function for SDL_WINDOWEVENT subtypes void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, std::vector<SDLContext::EventData> & event_list) { - // switch (window_event.event) { - // case SDL_WINDOWEVENT_EXPOSED: - // event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_RESIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, - // {}, - // {}, - // {{}, {window_event.data1, window_event.data2}}}); - // break; - // case SDL_WINDOWEVENT_MOVED: - // event_list.push_back({SDLContext::EventType::WINDOW_MOVE, - // {}, - // {}, - // {{window_event.data1, window_event.data2}, {}}}); - // break; - // case SDL_WINDOWEVENT_MINIMIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_MAXIMIZED: - // event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_FOCUS_GAINED: - // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - // break; - // case SDL_WINDOWEVENT_FOCUS_LOST: - // event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - // break; - // } + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_EXPOSE}); + break; + case SDL_WINDOWEVENT_RESIZED: { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::WINDOW_RESIZE; + transfer_event.data.window_data = WindowData{ + .resize_dimension = {window_event.data1, window_event.data2} + }; + event_list.push_back(transfer_event); + break; + } + case SDL_WINDOWEVENT_MOVED: { + EventData transfer_event; + transfer_event.event_type = SDLContext::EventType::WINDOW_MOVE; + transfer_event.data.window_data = WindowData{ + .move_delta = {window_event.data1, window_event.data2} + }; + event_list.push_back(transfer_event); + break; + } + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_MINIMIZE}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_MAXIMIZE}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_GAIN}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_LOST}); + break; + } } void SDLContext::set_color_texture(const Texture & texture, const Color & color) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index b10bcfe..e56d531 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -116,11 +116,6 @@ public: EventDataUnion() {} ~EventDataUnion() {} } data; - - // Helper functions - // bool isKeyEvent() const { return event_type == SDLContext::EventType::KEYDOWN || event_type == SDLContext::EventType::KEYUP; } - // bool isMouseEvent() const { return event_type == SDLContext::EventType::MOUSEDOWN || event_type == SDLContext::EventType::MOUSEUP || event_type == SDLContext::EventType::MOUSEMOVE; } - // bool isWindowEvent() const { return event_type == SDLContext::EventType::WINDOW_MINIMIZE || event_type == SDLContext::EventType::WINDOW_RESIZE; } }; /** * \brief Retrieves the current state of the keyboard. diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 32538e8..bb454af 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,4 +1,3 @@ -#include <iostream> #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" @@ -11,7 +10,7 @@ using namespace crepe; void InputSystem::update() { ComponentManager & mgr = this->mediator.component_manager; - EventManager & event_mgr = this->mediator.event_manager; + SDLContext & context = this->mediator.sdl_context; std::vector<SDLContext::EventData> event_list = context.get_events(); RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -31,129 +30,135 @@ void InputSystem::update() { = mgr.get_components_by_id<Transform>(current_cam.game_object_id); Transform & cam_transform = transform_vec.front().get(); - ivec2 camera_origin; - int camera_origin_x = cam_transform.position.x + current_cam.data.postion_offset.x - - (current_cam.viewport_size.x / 2); - int camera_origin_y = cam_transform.position.y + current_cam.data.postion_offset.y - - (current_cam.viewport_size.y / 2); + vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset + - (current_cam.viewport_size / 2); for (const SDLContext::EventData & event : event_list) { // Only calculate mouse coordinates for relevant events - if (event.event_type == SDLContext::EventType::MOUSEDOWN - || event.event_type == SDLContext::EventType::MOUSEUP - || event.event_type == SDLContext::EventType::MOUSEMOVE - || event.event_type == SDLContext::EventType::MOUSEWHEEL) { - - ivec2 adjusted_mouse; - std::cout << "mousePos X: " << event.data.mouse_data.mouse_position.x << std::endl; - std::cout << "mousePos Y: " << event.data.mouse_data.mouse_position.y << std::endl; - int world_mouse_x = event.data.mouse_data.mouse_position.x + camera_origin_x; - int world_mouse_y = event.data.mouse_data.mouse_position.y + camera_origin_y; - // Check if the mouse is within the viewport - bool mouse_in_viewport - = !(world_mouse_x < camera_origin_x - || world_mouse_x > camera_origin_x + current_cam.viewport_size.x - || world_mouse_y < camera_origin_y - || world_mouse_y > camera_origin_y + current_cam.viewport_size.y); - std::cout << "in view " << mouse_in_viewport << std::endl; - if (!mouse_in_viewport) continue; - - // Handle mouse-specific events - switch (event.event_type) { - case SDLContext::EventType::MOUSEDOWN: - event_mgr.queue_event<MousePressEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - this->last_mouse_down_position = {adjusted_mouse.x, adjusted_mouse.y}; - this->last_mouse_button = event.data.mouse_data.mouse_button; - break; - - case SDLContext::EventType::MOUSEUP: { - event_mgr.queue_event<MouseReleaseEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - int delta_x = adjusted_mouse.x - this->last_mouse_down_position.x; - int delta_y = adjusted_mouse.y - this->last_mouse_down_position.y; - - if (this->last_mouse_button == event.data.mouse_data.mouse_button - && std::abs(delta_x) <= click_tolerance - && std::abs(delta_y) <= click_tolerance) { - event_mgr.queue_event<MouseClickEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .button = event.data.mouse_data.mouse_button, - }); - this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse); - } - break; - } - - case SDLContext::EventType::MOUSEMOVE: - event_mgr.queue_event<MouseMoveEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .mouse_delta = event.data.mouse_data.rel_mouse_move, - }); - this->handle_move(event, adjusted_mouse); - break; - - case SDLContext::EventType::MOUSEWHEEL: - event_mgr.queue_event<MouseScrollEvent>({ - .mouse_pos = {adjusted_mouse.x, adjusted_mouse.y}, - .scroll_direction = event.data.mouse_data.scroll_direction, - .scroll_delta = event.data.mouse_data.scroll_delta, - }); - break; - - default: - break; - } + if(this->is_mouse_event(event.event_type)) { + this->handle_mouse_event(event,camera_origin,current_cam); + } else { - // Handle non-mouse events - switch (event.event_type) { - case SDLContext::EventType::KEYDOWN: - - event_mgr.queue_event<KeyPressEvent>( - {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); - break; - case SDLContext::EventType::KEYUP: - event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); - break; - case SDLContext::EventType::SHUTDOWN: - event_mgr.queue_event<ShutDownEvent>({}); - break; - case SDLContext::EventType::WINDOW_EXPOSE: - event_mgr.queue_event<WindowExposeEvent>({}); - break; - case SDLContext::EventType::WINDOW_RESIZE: - event_mgr.queue_event<WindowResizeEvent>( - WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); - break; - case SDLContext::EventType::WINDOW_MOVE: - event_mgr.queue_event<WindowMoveEvent>( - {.delta_move = event.data.window_data.move_delta}); - break; - case SDLContext::EventType::WINDOW_MINIMIZE: - event_mgr.queue_event<WindowMinimizeEvent>({}); - break; - case SDLContext::EventType::WINDOW_MAXIMIZE: - event_mgr.queue_event<WindowMaximizeEvent>({}); - break; - case SDLContext::EventType::WINDOW_FOCUS_GAIN: - event_mgr.queue_event<WindowFocusGainEvent>({}); - break; - case SDLContext::EventType::WINDOW_FOCUS_LOST: - event_mgr.queue_event<WindowFocusLostEvent>({}); - break; - default: - break; + this->handle_non_mouse_event(event); + + } + } +} + +void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, + const Camera ¤t_cam){ + EventManager & event_mgr = this->mediator.event_manager; + vec2 adjusted_mouse; + adjusted_mouse.x = event.data.mouse_data.mouse_position.x + camera_origin.x; + adjusted_mouse.x = event.data.mouse_data.mouse_position.y + camera_origin.y; + // Check if the mouse is within the viewport + if ((adjusted_mouse.x < camera_origin.x + || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse.y < camera_origin.y + || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y)) return; + + // Handle mouse-specific events + switch (event.event_type) { + case SDLContext::EventType::MOUSEDOWN: + event_mgr.queue_event<MousePressEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + this->last_mouse_down_position = adjusted_mouse; + this->last_mouse_button = event.data.mouse_data.mouse_button; + break; + + case SDLContext::EventType::MOUSEUP: { + event_mgr.queue_event<MouseReleaseEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + vec2 delta_move = adjusted_mouse - this->last_mouse_down_position; + int click_tolerance = Config::get_instance().input.click_tolerance; + if (this->last_mouse_button == event.data.mouse_data.mouse_button + && std::abs(delta_move.x) <= click_tolerance + && std::abs(delta_move.y) <= click_tolerance) { + event_mgr.queue_event<MouseClickEvent>({ + .mouse_pos = adjusted_mouse, + .button = event.data.mouse_data.mouse_button, + }); + this->handle_click(event.data.mouse_data.mouse_button, adjusted_mouse); } + break; } + + case SDLContext::EventType::MOUSEMOVE: + event_mgr.queue_event<MouseMoveEvent>({ + .mouse_pos = adjusted_mouse, + .mouse_delta = event.data.mouse_data.rel_mouse_move, + }); + this->handle_move(event, adjusted_mouse); + break; + + case SDLContext::EventType::MOUSEWHEEL: + event_mgr.queue_event<MouseScrollEvent>({ + .mouse_pos = adjusted_mouse, + .scroll_direction = event.data.mouse_data.scroll_direction, + .scroll_delta = event.data.mouse_data.scroll_delta, + }); + break; + + default: + break; + } +} + +void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){ + EventManager & event_mgr = this->mediator.event_manager; + switch (event.event_type) { + case SDLContext::EventType::KEYDOWN: + + event_mgr.queue_event<KeyPressEvent>( + {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); + break; + case SDLContext::EventType::KEYUP: + event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); + break; + case SDLContext::EventType::SHUTDOWN: + event_mgr.queue_event<ShutDownEvent>({}); + break; + case SDLContext::EventType::WINDOW_EXPOSE: + event_mgr.queue_event<WindowExposeEvent>({}); + break; + case SDLContext::EventType::WINDOW_RESIZE: + event_mgr.queue_event<WindowResizeEvent>( + WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); + break; + case SDLContext::EventType::WINDOW_MOVE: + event_mgr.queue_event<WindowMoveEvent>( + {.delta_move = event.data.window_data.move_delta}); + break; + case SDLContext::EventType::WINDOW_MINIMIZE: + event_mgr.queue_event<WindowMinimizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_MAXIMIZE: + event_mgr.queue_event<WindowMaximizeEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_GAIN: + event_mgr.queue_event<WindowFocusGainEvent>({}); + break; + case SDLContext::EventType::WINDOW_FOCUS_LOST: + event_mgr.queue_event<WindowFocusLostEvent>({}); + break; + default: + break; } } +bool InputSystem::is_mouse_event(SDLContext::EventType event_type){ + return (event_type == SDLContext::EventType::MOUSEDOWN + || event_type == SDLContext::EventType::MOUSEUP + || event_type == SDLContext::EventType::MOUSEMOVE + || event_type == SDLContext::EventType::MOUSEWHEEL); +} + void InputSystem::handle_move(const SDLContext::EventData & event_data, - const ivec2& mouse_pos) { + const vec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -183,7 +188,7 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, } } -void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mouse_pos) { +void InputSystem::handle_click(const MouseButton & mouse_button, const vec2& mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -203,7 +208,7 @@ void InputSystem::handle_click(const MouseButton & mouse_button, const ivec2& mo } } -bool InputSystem::is_mouse_inside_button(const ivec2& mouse_pos, +bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos, const Button & button, const Transform & transform) { int actual_x = transform.position.x + button.offset.x; int actual_y = transform.position.y + button.offset.y; diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 3703635..7b8f510 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -32,15 +32,36 @@ public: private: //! Stores the last position of the mouse when the button was pressed. - ivec2 last_mouse_down_position; + vec2 last_mouse_down_position; // TODO: specify world/hud space and make regular `vec2` //! Stores the last mouse button pressed. MouseButton last_mouse_button = MouseButton::NONE; - - //! The maximum allowable distance between mouse down and mouse up to register as a click. This can be changed using the Config. - int click_tolerance = Config::get_instance().input.click_tolerance; - + /** + * \brief Determines whether the given event type is a mouse event. + * \param event_type The event type to check. + * \return True if the event type corresponds to a mouse event, false otherwise. + */ + bool is_mouse_event(SDLContext::EventType event_type); + /** + * \brief Handles mouse-related events. + * \param event The event data for the mouse event. + * \param camera_origin The origin position of the camera in world space. + * \param current_cam The currently active camera. + * + * This method processes mouse events, adjusts the mouse position to world coordinates, + * and triggers the appropriate mouse-specific event handling logic. + */ + void handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, + const Camera ¤t_cam); + /** + * \brief Handles non-mouse-related events. + * \param event The event data for the non-mouse event. + * + * This method processes events that do not involve the mouse, such as keyboard events, + * window events, and shutdown events, and triggers the corresponding event actions. + */ + void handle_non_mouse_event(const SDLContext::EventData &event); /** * \brief Handles the mouse click event. * \param mouse_button The mouse button involved in the click. @@ -49,7 +70,7 @@ private: * * This method processes the mouse click event and triggers the corresponding button action. */ - void handle_click(const MouseButton & mouse_button,const ivec2& mouse_pos); + void handle_click(const MouseButton & mouse_button,const vec2& mouse_pos); /** * \brief Handles the mouse movement event. @@ -59,7 +80,7 @@ private: * * This method processes the mouse movement event and updates the button hover state. */ - void handle_move(const SDLContext::EventData & event_data, const ivec2& mouse_pos); + void handle_move(const SDLContext::EventData & event_data, const vec2& mouse_pos); /** * \brief Checks if the mouse position is inside the bounds of the button. @@ -69,7 +90,7 @@ private: * \param transform The transform component of the button. * \return True if the mouse is inside the button, false otherwise. */ - bool is_mouse_inside_button(const ivec2& mouse_pos, + bool is_mouse_inside_button(const vec2& mouse_pos, const Button & button, const Transform & transform); /** diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 7a28882..7063561 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -43,7 +43,8 @@ protected: //mediator.component_manager = mgr; //event_manager.clear(); } - + void TearDown() override { + } void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { SDL_Event event; @@ -261,52 +262,3 @@ TEST_F(InputTest, testButtonHover) { event_manager.dispatch_events(); EXPECT_TRUE(button.hover); } - -TEST_F(InputTest, WindowResizeTest) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool callback_triggered = false; - EventHandler<WindowResizeEvent> on_window_resize = [&](const WindowResizeEvent & event) { - callback_triggered = true; - EXPECT_EQ(event.dimensions.x, 800); - EXPECT_EQ(event.dimensions.y, 600); - return false; - }; - event_manager.subscribe<WindowResizeEvent>(on_window_resize); - SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_RESIZED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(callback_triggered); -} -TEST_F(InputTest, WindowMoveTest) { - GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>( - ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - camera.active = true; - bool callback_triggered = false; - EventHandler<WindowMoveEvent> on_window_move = [&](const WindowMoveEvent & event) { - callback_triggered = true; - EXPECT_EQ(event.delta_move.x, 800); - EXPECT_EQ(event.delta_move.y, 600); - return false; - }; - event_manager.subscribe<WindowMoveEvent>(on_window_move); - SDL_Event resize_event; - SDL_zero(resize_event); - resize_event.type = SDL_WINDOWEVENT; - resize_event.window.event = SDL_WINDOWEVENT_MOVED; - resize_event.window.data1 = 800; // new width - resize_event.window.data2 = 600; // new height - SDL_PushEvent(&resize_event); - input_system.update(); - event_manager.dispatch_events(); - EXPECT_TRUE(callback_triggered); -} -- cgit v1.2.3 From 4b816c460d3b2fb81123ac7ce6113216fc7c9b17 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Fri, 13 Dec 2024 09:18:03 +0100 Subject: reverted Keycode back --- src/crepe/api/KeyCodes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index a9141e2..a13d1af 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -16,7 +16,7 @@ enum class MouseButton { }; //! Enumeration for keyboard key inputs, including printable characters, function keys, and keypad keys. -typedef enum { +enum class Keycode { NONE = 0, //!< No key input. SPACE = 32, //!< Spacebar. APOSTROPHE = 39, //!< Apostrophe ('). @@ -153,7 +153,7 @@ typedef enum { RIGHT_SUPER = 347, /// \} MENU = 348, //!< Menu key. -} Keycode; +}; } // namespace crepe -- cgit v1.2.3 From a03f90fa9bcbd5a0c5b5d1f2e50df183c7c3640c Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Fri, 13 Dec 2024 09:19:55 +0100 Subject: make format --- src/crepe/api/KeyCodes.h | 1 - src/crepe/facade/SDLContext.cpp | 57 +++++----- src/crepe/facade/SDLContext.h | 218 +++++++++++++++++++-------------------- src/crepe/system/InputSystem.cpp | 57 +++++----- src/crepe/system/InputSystem.h | 14 +-- src/test/EventTest.cpp | 6 +- src/test/InputTest.cpp | 9 +- 7 files changed, 175 insertions(+), 187 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index a13d1af..dc3219a 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -155,5 +155,4 @@ enum class Keycode { MENU = 348, //!< Menu key. }; - } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 7c7d58e..7e19ede 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -77,11 +77,11 @@ SDLContext::~SDLContext() { Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { auto it = LOOKUP_TABLE.find(sdl_key); - if (it != LOOKUP_TABLE.end()) { - return it->second; - } + if (it != LOOKUP_TABLE.end()) { + return it->second; + } - return Keycode::NONE; + return Keycode::NONE; } void SDLContext::update_keyboard_state() { // Array to hold the key states (true if pressed, false if not) @@ -95,7 +95,6 @@ void SDLContext::update_keyboard_state() { this->keyboard_state[key] = current_state[i] != 0; } } - } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -286,8 +285,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { case SDL_QUIT: event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN}); break; - case SDL_KEYDOWN: - { + case SDL_KEYDOWN: { this->update_keyboard_state(); EventData transfer_event; transfer_event.event_type = SDLContext::EventType::KEYDOWN; @@ -296,10 +294,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .key_repeat = event.key.repeat != 0, }; event_list.push_back(transfer_event); - } break; - case SDL_KEYUP: - { + } + + case SDL_KEYUP: { this->update_keyboard_state(); EventData transfer_event; transfer_event.event_type = SDLContext::EventType::KEYUP; @@ -308,10 +306,10 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .key_repeat = false, }; event_list.push_back(transfer_event); - } break; - case SDL_MOUSEBUTTONDOWN: - { + } + + case SDL_MOUSEBUTTONDOWN: { EventData transfer_event; transfer_event.event_type = SDLContext::EventType::MOUSEDOWN; transfer_event.data.mouse_data = MouseData{ @@ -319,10 +317,9 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .mouse_position = mouse_pos, }; event_list.push_back(transfer_event); - - } break; - case SDL_MOUSEBUTTONUP: - { + break; + } + case SDL_MOUSEBUTTONUP: { EventData transfer_event; transfer_event.event_type = SDLContext::EventType::MOUSEUP; transfer_event.data.mouse_data = MouseData{ @@ -330,8 +327,8 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .mouse_position = mouse_pos, }; event_list.push_back(transfer_event); - - } break; + break; + } case SDL_MOUSEMOTION: { EventData transfer_event; @@ -341,7 +338,8 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .rel_mouse_move = {event.motion.xrel, event.motion.yrel}, }; event_list.push_back(transfer_event); - } break; + break; + } case SDL_MOUSEWHEEL: { EventData transfer_event; @@ -352,10 +350,11 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { .scroll_delta = event.wheel.preciseY, }; event_list.push_back(transfer_event); - } break; - case SDL_WINDOWEVENT: - handle_window_event(event.window, event_list); - break; + break; + } + case SDL_WINDOWEVENT: + handle_window_event(event.window, event_list); + break; } } @@ -371,18 +370,16 @@ void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, case SDL_WINDOWEVENT_RESIZED: { EventData transfer_event; transfer_event.event_type = SDLContext::EventType::WINDOW_RESIZE; - transfer_event.data.window_data = WindowData{ - .resize_dimension = {window_event.data1, window_event.data2} - }; + transfer_event.data.window_data + = WindowData{.resize_dimension = {window_event.data1, window_event.data2}}; event_list.push_back(transfer_event); break; } case SDL_WINDOWEVENT_MOVED: { EventData transfer_event; transfer_event.event_type = SDLContext::EventType::WINDOW_MOVE; - transfer_event.data.window_data = WindowData{ - .move_delta = {window_event.data1, window_event.data2} - }; + transfer_event.data.window_data + = WindowData{.move_delta = {window_event.data1, window_event.data2}}; event_list.push_back(transfer_event); break; } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index e56d531..7ccefeb 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -106,16 +106,16 @@ public: }; //! EventData struct for passing event data from facade struct EventData { - SDLContext::EventType event_type = SDLContext::EventType::NONE; + SDLContext::EventType event_type = SDLContext::EventType::NONE; - union EventDataUnion { - KeyData key_data; - MouseData mouse_data; - WindowData window_data; + union EventDataUnion { + KeyData key_data; + MouseData mouse_data; + WindowData window_data; - EventDataUnion() {} - ~EventDataUnion() {} - } data; + EventDataUnion() {} + ~EventDataUnion() {} + } data; }; /** * \brief Retrieves the current state of the keyboard. @@ -286,108 +286,108 @@ private: * - this is defined in this class because get_events() needs this information aswell */ CameraAuxiliaryData cam_aux_data; -private: + +private: std::unordered_map<Keycode, bool> keyboard_state; - const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = { - {SDL_SCANCODE_SPACE, Keycode::SPACE}, - {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, - {SDL_SCANCODE_COMMA, Keycode::COMMA}, - {SDL_SCANCODE_MINUS, Keycode::MINUS}, - {SDL_SCANCODE_PERIOD, Keycode::PERIOD}, - {SDL_SCANCODE_SLASH, Keycode::SLASH}, - {SDL_SCANCODE_0, Keycode::D0}, - {SDL_SCANCODE_1, Keycode::D1}, - {SDL_SCANCODE_2, Keycode::D2}, - {SDL_SCANCODE_3, Keycode::D3}, - {SDL_SCANCODE_4, Keycode::D4}, - {SDL_SCANCODE_5, Keycode::D5}, - {SDL_SCANCODE_6, Keycode::D6}, - {SDL_SCANCODE_7, Keycode::D7}, - {SDL_SCANCODE_8, Keycode::D8}, - {SDL_SCANCODE_9, Keycode::D9}, - {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON}, - {SDL_SCANCODE_EQUALS, Keycode::EQUAL}, - {SDL_SCANCODE_A, Keycode::A}, - {SDL_SCANCODE_B, Keycode::B}, - {SDL_SCANCODE_C, Keycode::C}, - {SDL_SCANCODE_D, Keycode::D}, - {SDL_SCANCODE_E, Keycode::E}, - {SDL_SCANCODE_F, Keycode::F}, - {SDL_SCANCODE_G, Keycode::G}, - {SDL_SCANCODE_H, Keycode::H}, - {SDL_SCANCODE_I, Keycode::I}, - {SDL_SCANCODE_J, Keycode::J}, - {SDL_SCANCODE_K, Keycode::K}, - {SDL_SCANCODE_L, Keycode::L}, - {SDL_SCANCODE_M, Keycode::M}, - {SDL_SCANCODE_N, Keycode::N}, - {SDL_SCANCODE_O, Keycode::O}, - {SDL_SCANCODE_P, Keycode::P}, - {SDL_SCANCODE_Q, Keycode::Q}, - {SDL_SCANCODE_R, Keycode::R}, - {SDL_SCANCODE_S, Keycode::S}, - {SDL_SCANCODE_T, Keycode::T}, - {SDL_SCANCODE_U, Keycode::U}, - {SDL_SCANCODE_V, Keycode::V}, - {SDL_SCANCODE_W, Keycode::W}, - {SDL_SCANCODE_X, Keycode::X}, - {SDL_SCANCODE_Y, Keycode::Y}, - {SDL_SCANCODE_Z, Keycode::Z}, - {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET}, - {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH}, - {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET}, - {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT}, - {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE}, - {SDL_SCANCODE_RETURN, Keycode::ENTER}, - {SDL_SCANCODE_TAB, Keycode::TAB}, - {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE}, - {SDL_SCANCODE_INSERT, Keycode::INSERT}, - {SDL_SCANCODE_DELETE, Keycode::DELETE}, - {SDL_SCANCODE_RIGHT, Keycode::RIGHT}, - {SDL_SCANCODE_LEFT, Keycode::LEFT}, - {SDL_SCANCODE_DOWN, Keycode::DOWN}, - {SDL_SCANCODE_UP, Keycode::UP}, - {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP}, - {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN}, - {SDL_SCANCODE_HOME, Keycode::HOME}, - {SDL_SCANCODE_END, Keycode::END}, - {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK}, - {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK}, - {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK}, - {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN}, - {SDL_SCANCODE_PAUSE, Keycode::PAUSE}, - {SDL_SCANCODE_F1, Keycode::F1}, - {SDL_SCANCODE_F2, Keycode::F2}, - {SDL_SCANCODE_F3, Keycode::F3}, - {SDL_SCANCODE_F4, Keycode::F4}, - {SDL_SCANCODE_F5, Keycode::F5}, - {SDL_SCANCODE_F6, Keycode::F6}, - {SDL_SCANCODE_F7, Keycode::F7}, - {SDL_SCANCODE_F8, Keycode::F8}, - {SDL_SCANCODE_F9, Keycode::F9}, - {SDL_SCANCODE_F10, Keycode::F10}, - {SDL_SCANCODE_F11, Keycode::F11}, - {SDL_SCANCODE_F12, Keycode::F12}, - {SDL_SCANCODE_KP_0, Keycode::KP0}, - {SDL_SCANCODE_KP_1, Keycode::KP1}, - {SDL_SCANCODE_KP_2, Keycode::KP2}, - {SDL_SCANCODE_KP_3, Keycode::KP3}, - {SDL_SCANCODE_KP_4, Keycode::KP4}, - {SDL_SCANCODE_KP_5, Keycode::KP5}, - {SDL_SCANCODE_KP_6, Keycode::KP6}, - {SDL_SCANCODE_KP_7, Keycode::KP7}, - {SDL_SCANCODE_KP_8, Keycode::KP8}, - {SDL_SCANCODE_KP_9, Keycode::KP9}, - {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT}, - {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL}, - {SDL_SCANCODE_LALT, Keycode::LEFT_ALT}, - {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER}, - {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT}, - {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL}, - {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT}, - {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER}, - {SDL_SCANCODE_MENU, Keycode::MENU} - }; + const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE + = {{SDL_SCANCODE_SPACE, Keycode::SPACE}, + {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, + {SDL_SCANCODE_COMMA, Keycode::COMMA}, + {SDL_SCANCODE_MINUS, Keycode::MINUS}, + {SDL_SCANCODE_PERIOD, Keycode::PERIOD}, + {SDL_SCANCODE_SLASH, Keycode::SLASH}, + {SDL_SCANCODE_0, Keycode::D0}, + {SDL_SCANCODE_1, Keycode::D1}, + {SDL_SCANCODE_2, Keycode::D2}, + {SDL_SCANCODE_3, Keycode::D3}, + {SDL_SCANCODE_4, Keycode::D4}, + {SDL_SCANCODE_5, Keycode::D5}, + {SDL_SCANCODE_6, Keycode::D6}, + {SDL_SCANCODE_7, Keycode::D7}, + {SDL_SCANCODE_8, Keycode::D8}, + {SDL_SCANCODE_9, Keycode::D9}, + {SDL_SCANCODE_SEMICOLON, Keycode::SEMICOLON}, + {SDL_SCANCODE_EQUALS, Keycode::EQUAL}, + {SDL_SCANCODE_A, Keycode::A}, + {SDL_SCANCODE_B, Keycode::B}, + {SDL_SCANCODE_C, Keycode::C}, + {SDL_SCANCODE_D, Keycode::D}, + {SDL_SCANCODE_E, Keycode::E}, + {SDL_SCANCODE_F, Keycode::F}, + {SDL_SCANCODE_G, Keycode::G}, + {SDL_SCANCODE_H, Keycode::H}, + {SDL_SCANCODE_I, Keycode::I}, + {SDL_SCANCODE_J, Keycode::J}, + {SDL_SCANCODE_K, Keycode::K}, + {SDL_SCANCODE_L, Keycode::L}, + {SDL_SCANCODE_M, Keycode::M}, + {SDL_SCANCODE_N, Keycode::N}, + {SDL_SCANCODE_O, Keycode::O}, + {SDL_SCANCODE_P, Keycode::P}, + {SDL_SCANCODE_Q, Keycode::Q}, + {SDL_SCANCODE_R, Keycode::R}, + {SDL_SCANCODE_S, Keycode::S}, + {SDL_SCANCODE_T, Keycode::T}, + {SDL_SCANCODE_U, Keycode::U}, + {SDL_SCANCODE_V, Keycode::V}, + {SDL_SCANCODE_W, Keycode::W}, + {SDL_SCANCODE_X, Keycode::X}, + {SDL_SCANCODE_Y, Keycode::Y}, + {SDL_SCANCODE_Z, Keycode::Z}, + {SDL_SCANCODE_LEFTBRACKET, Keycode::LEFT_BRACKET}, + {SDL_SCANCODE_BACKSLASH, Keycode::BACKSLASH}, + {SDL_SCANCODE_RIGHTBRACKET, Keycode::RIGHT_BRACKET}, + {SDL_SCANCODE_GRAVE, Keycode::GRAVE_ACCENT}, + {SDL_SCANCODE_ESCAPE, Keycode::ESCAPE}, + {SDL_SCANCODE_RETURN, Keycode::ENTER}, + {SDL_SCANCODE_TAB, Keycode::TAB}, + {SDL_SCANCODE_BACKSPACE, Keycode::BACKSPACE}, + {SDL_SCANCODE_INSERT, Keycode::INSERT}, + {SDL_SCANCODE_DELETE, Keycode::DELETE}, + {SDL_SCANCODE_RIGHT, Keycode::RIGHT}, + {SDL_SCANCODE_LEFT, Keycode::LEFT}, + {SDL_SCANCODE_DOWN, Keycode::DOWN}, + {SDL_SCANCODE_UP, Keycode::UP}, + {SDL_SCANCODE_PAGEUP, Keycode::PAGE_UP}, + {SDL_SCANCODE_PAGEDOWN, Keycode::PAGE_DOWN}, + {SDL_SCANCODE_HOME, Keycode::HOME}, + {SDL_SCANCODE_END, Keycode::END}, + {SDL_SCANCODE_CAPSLOCK, Keycode::CAPS_LOCK}, + {SDL_SCANCODE_SCROLLLOCK, Keycode::SCROLL_LOCK}, + {SDL_SCANCODE_NUMLOCKCLEAR, Keycode::NUM_LOCK}, + {SDL_SCANCODE_PRINTSCREEN, Keycode::PRINT_SCREEN}, + {SDL_SCANCODE_PAUSE, Keycode::PAUSE}, + {SDL_SCANCODE_F1, Keycode::F1}, + {SDL_SCANCODE_F2, Keycode::F2}, + {SDL_SCANCODE_F3, Keycode::F3}, + {SDL_SCANCODE_F4, Keycode::F4}, + {SDL_SCANCODE_F5, Keycode::F5}, + {SDL_SCANCODE_F6, Keycode::F6}, + {SDL_SCANCODE_F7, Keycode::F7}, + {SDL_SCANCODE_F8, Keycode::F8}, + {SDL_SCANCODE_F9, Keycode::F9}, + {SDL_SCANCODE_F10, Keycode::F10}, + {SDL_SCANCODE_F11, Keycode::F11}, + {SDL_SCANCODE_F12, Keycode::F12}, + {SDL_SCANCODE_KP_0, Keycode::KP0}, + {SDL_SCANCODE_KP_1, Keycode::KP1}, + {SDL_SCANCODE_KP_2, Keycode::KP2}, + {SDL_SCANCODE_KP_3, Keycode::KP3}, + {SDL_SCANCODE_KP_4, Keycode::KP4}, + {SDL_SCANCODE_KP_5, Keycode::KP5}, + {SDL_SCANCODE_KP_6, Keycode::KP6}, + {SDL_SCANCODE_KP_7, Keycode::KP7}, + {SDL_SCANCODE_KP_8, Keycode::KP8}, + {SDL_SCANCODE_KP_9, Keycode::KP9}, + {SDL_SCANCODE_LSHIFT, Keycode::LEFT_SHIFT}, + {SDL_SCANCODE_LCTRL, Keycode::LEFT_CONTROL}, + {SDL_SCANCODE_LALT, Keycode::LEFT_ALT}, + {SDL_SCANCODE_LGUI, Keycode::LEFT_SUPER}, + {SDL_SCANCODE_RSHIFT, Keycode::RIGHT_SHIFT}, + {SDL_SCANCODE_RCTRL, Keycode::RIGHT_CONTROL}, + {SDL_SCANCODE_RALT, Keycode::RIGHT_ALT}, + {SDL_SCANCODE_RGUI, Keycode::RIGHT_SUPER}, + {SDL_SCANCODE_MENU, Keycode::MENU}}; }; } // namespace crepe diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index bb454af..8de700b 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -10,7 +10,7 @@ using namespace crepe; void InputSystem::update() { ComponentManager & mgr = this->mediator.component_manager; - + SDLContext & context = this->mediator.sdl_context; std::vector<SDLContext::EventData> event_list = context.get_events(); RefVector<Button> buttons = mgr.get_components_by_type<Button>(); @@ -31,31 +31,31 @@ void InputSystem::update() { Transform & cam_transform = transform_vec.front().get(); vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset - - (current_cam.viewport_size / 2); + - (current_cam.viewport_size / 2); for (const SDLContext::EventData & event : event_list) { // Only calculate mouse coordinates for relevant events - if(this->is_mouse_event(event.event_type)) { - this->handle_mouse_event(event,camera_origin,current_cam); - + if (this->is_mouse_event(event.event_type)) { + this->handle_mouse_event(event, camera_origin, current_cam); + } else { this->handle_non_mouse_event(event); - } } } -void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, - const Camera ¤t_cam){ +void InputSystem::handle_mouse_event(const SDLContext::EventData & event, + const vec2 & camera_origin, const Camera & current_cam) { EventManager & event_mgr = this->mediator.event_manager; vec2 adjusted_mouse; adjusted_mouse.x = event.data.mouse_data.mouse_position.x + camera_origin.x; adjusted_mouse.x = event.data.mouse_data.mouse_position.y + camera_origin.y; // Check if the mouse is within the viewport if ((adjusted_mouse.x < camera_origin.x - || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x - || adjusted_mouse.y < camera_origin.y - || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y)) return; + || adjusted_mouse.x > camera_origin.x + current_cam.viewport_size.x + || adjusted_mouse.y < camera_origin.y + || adjusted_mouse.y > camera_origin.y + current_cam.viewport_size.y)) + return; // Handle mouse-specific events switch (event.event_type) { @@ -105,14 +105,14 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData &event, const v default: break; - } + } } -void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){ +void InputSystem::handle_non_mouse_event(const SDLContext::EventData & event) { EventManager & event_mgr = this->mediator.event_manager; switch (event.event_type) { case SDLContext::EventType::KEYDOWN: - + event_mgr.queue_event<KeyPressEvent>( {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); break; @@ -150,7 +150,7 @@ void InputSystem::handle_non_mouse_event(const SDLContext::EventData &event){ } } -bool InputSystem::is_mouse_event(SDLContext::EventType event_type){ +bool InputSystem::is_mouse_event(SDLContext::EventType event_type) { return (event_type == SDLContext::EventType::MOUSEDOWN || event_type == SDLContext::EventType::MOUSEUP || event_type == SDLContext::EventType::MOUSEMOVE @@ -158,29 +158,28 @@ bool InputSystem::is_mouse_event(SDLContext::EventType event_type){ } void InputSystem::handle_move(const SDLContext::EventData & event_data, - const vec2& mouse_pos) { + const vec2 & mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); for (Button & button : buttons) { - if(!button.active) continue; + if (!button.active) continue; RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(button.game_object_id); Transform & transform(transform_vec.front().get()); bool was_hovering = button.hover; - if (this->is_mouse_inside_button(mouse_pos, button, - transform)) { + if (this->is_mouse_inside_button(mouse_pos, button, transform)) { button.hover = true; - if(!button.on_mouse_enter) continue; + if (!button.on_mouse_enter) continue; if (!was_hovering) { button.on_mouse_enter(); } } else { button.hover = false; // Trigger the on_exit callback if the hover state just changed to false - if(!button.on_mouse_exit) continue; + if (!button.on_mouse_exit) continue; if (was_hovering) { button.on_mouse_exit(); } @@ -188,28 +187,27 @@ void InputSystem::handle_move(const SDLContext::EventData & event_data, } } -void InputSystem::handle_click(const MouseButton & mouse_button, const vec2& mouse_pos) { +void InputSystem::handle_click(const MouseButton & mouse_button, const vec2 & mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); for (Button & button : buttons) { - if(!button.active) continue; + if (!button.active) continue; if (!button.on_click) continue; RefVector<Transform> transform_vec = mgr.get_components_by_id<Transform>(button.game_object_id); Transform & transform = transform_vec.front().get(); - - if (this->is_mouse_inside_button(mouse_pos, button, - transform)) { - + + if (this->is_mouse_inside_button(mouse_pos, button, transform)) { + button.on_click(); } } } -bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos, - const Button & button, const Transform & transform) { +bool InputSystem::is_mouse_inside_button(const vec2 & mouse_pos, const Button & button, + const Transform & transform) { int actual_x = transform.position.x + button.offset.x; int actual_y = transform.position.y + button.offset.y; @@ -220,4 +218,3 @@ bool InputSystem::is_mouse_inside_button(const vec2& mouse_pos, return mouse_pos.x >= actual_x - half_width && mouse_pos.x <= actual_x + half_width && mouse_pos.y >= actual_y - half_height && mouse_pos.y <= actual_y + half_height; } - diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 7b8f510..63dfae5 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -52,8 +52,8 @@ private: * This method processes mouse events, adjusts the mouse position to world coordinates, * and triggers the appropriate mouse-specific event handling logic. */ - void handle_mouse_event(const SDLContext::EventData &event, const vec2 &camera_origin, - const Camera ¤t_cam); + void handle_mouse_event(const SDLContext::EventData & event, const vec2 & camera_origin, + const Camera & current_cam); /** * \brief Handles non-mouse-related events. * \param event The event data for the non-mouse event. @@ -61,7 +61,7 @@ private: * This method processes events that do not involve the mouse, such as keyboard events, * window events, and shutdown events, and triggers the corresponding event actions. */ - void handle_non_mouse_event(const SDLContext::EventData &event); + void handle_non_mouse_event(const SDLContext::EventData & event); /** * \brief Handles the mouse click event. * \param mouse_button The mouse button involved in the click. @@ -70,7 +70,7 @@ private: * * This method processes the mouse click event and triggers the corresponding button action. */ - void handle_click(const MouseButton & mouse_button,const vec2& mouse_pos); + void handle_click(const MouseButton & mouse_button, const vec2 & mouse_pos); /** * \brief Handles the mouse movement event. @@ -80,7 +80,7 @@ private: * * This method processes the mouse movement event and updates the button hover state. */ - void handle_move(const SDLContext::EventData & event_data, const vec2& mouse_pos); + void handle_move(const SDLContext::EventData & event_data, const vec2 & mouse_pos); /** * \brief Checks if the mouse position is inside the bounds of the button. @@ -90,8 +90,8 @@ private: * \param transform The transform component of the button. * \return True if the mouse is inside the button, false otherwise. */ - bool is_mouse_inside_button(const vec2& mouse_pos, - const Button & button, const Transform & transform); + bool is_mouse_inside_button(const vec2 & mouse_pos, const Button & button, + const Transform & transform); /** * \brief Handles the button press event, calling the on_click callback if necessary. diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp index f30f15a..f8be3fe 100644 --- a/src/test/EventTest.cpp +++ b/src/test/EventTest.cpp @@ -56,8 +56,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_all_channels) { event_mgr.subscribe<MouseClickEvent>(mouse_handler, EventManager::CHANNEL_ALL); MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; - event_mgr.trigger_event<MouseClickEvent>(click_event, - EventManager::CHANNEL_ALL); + event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); EXPECT_TRUE(triggered); } @@ -74,8 +73,7 @@ TEST_F(EventManagerTest, EventManagerTest_trigger_one_channel) { event_mgr.subscribe<MouseClickEvent>(mouse_handler, test_channel); MouseClickEvent click_event{.mouse_pos = {100, 200}, .button = MouseButton::LEFT_MOUSE}; - event_mgr.trigger_event<MouseClickEvent>(click_event, - EventManager::CHANNEL_ALL); + event_mgr.trigger_event<MouseClickEvent>(click_event, EventManager::CHANNEL_ALL); EXPECT_FALSE(triggered); event_mgr.trigger_event<MouseClickEvent>(click_event, test_channel); diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 7063561..09163a6 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -43,8 +43,7 @@ protected: //mediator.component_manager = mgr; //event_manager.clear(); } - void TearDown() override { - } + void TearDown() override {} void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { SDL_Event event; @@ -210,8 +209,7 @@ TEST_F(InputTest, testButtonClick) { GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); bool button_clicked = false; std::function<void()> on_click = [&]() { button_clicked = true; }; - auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); + auto & button = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); bool hover = false; button.active = true; @@ -230,8 +228,7 @@ TEST_F(InputTest, testButtonHover) { GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); bool button_clicked = false; std::function<void()> on_click = [&]() { button_clicked = true; }; - auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); + auto & button = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click); button.active = true; // Mouse not on button -- cgit v1.2.3 From 5ad9f5c81ae20f4b7aa2c1773bce8906096754f3 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Fri, 13 Dec 2024 18:49:51 +0100 Subject: friend explained --- src/crepe/Particle.h | 2 -- src/crepe/api/ParticleEmitter.h | 10 ++++++---- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index 49fec1f..0170117 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -14,8 +14,6 @@ namespace crepe { * can also be reset or stopped. */ class Particle { - // TODO: add friend particleSsytem and rendersystem. Unit test will fail. - public: //! Position of the particle in 2D space. vec2 position; diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index e0b117a..5b8e8e3 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -54,11 +54,11 @@ public: //! maximum number of particles const unsigned int max_particles = 256; //! rate of particle emission per second - float emission_rate = 1; + float emission_rate = 50; //! min speed of the particles - float min_speed = 1; + float min_speed = 100; //! min speed of the particles - float max_speed = 2; + float max_speed = 100; //! min angle of particle emission float min_angle = 0; //! max angle of particle emission @@ -84,9 +84,11 @@ public: //! Configuration data for particle emission settings. Data data; private: - //! Saves time left over from last update event. + //! Only ParticleSystem can move and read particles friend ParticleSystem; + //! Only RenderSystem can read particles friend RenderSystem; + //! Saves time left over from last update event. float spawn_accumulator = 0; //! collection of particles std::vector<Particle> particles; -- cgit v1.2.3 From 79741613fdf915bfb8b7517826205d2cb1715971 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Fri, 13 Dec 2024 18:54:30 +0100 Subject: removed some not needed const --- src/crepe/system/ParticleSystem.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index a56de60..f98f245 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -71,24 +71,25 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & t float half_width = emitter.data.boundary.width / 2.0; float half_height = emitter.data.boundary.height / 2.0; - const float LEFT = offset.x - half_width; - const float RIGHT = offset.x + half_width; - const float TOP = offset.y - half_height; - const float BOTTOM = offset.y + half_height; + float left = offset.x - half_width; + float right = offset.x + half_width; + float top = offset.y - half_height; + float bottom = offset.y + half_height; for (Particle & particle : emitter.particles) { const vec2 & position = particle.position; - bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP - && position.y <= BOTTOM); + bool within_bounds = (position.x >= left && position.x <= right && position.y >= top + && position.y <= bottom); + //if not within bounds do a reset or stop velocity if (!within_bounds) { if (emitter.data.boundary.reset_on_exit) { particle.active = false; } else { particle.velocity = {0, 0}; - if (position.x < LEFT) particle.position.x = LEFT; - else if (position.x > RIGHT) particle.position.x = RIGHT; - if (position.y < TOP) particle.position.y = TOP; - else if (position.y > BOTTOM) particle.position.y = BOTTOM; + if (position.x < left) particle.position.x = left; + else if (position.x > right) particle.position.x = right; + if (position.y < top) particle.position.y = top; + else if (position.y > bottom) particle.position.y = bottom; } } } -- cgit v1.2.3 From 512aa7f54b88994d3095971b2001930b4e612947 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Fri, 13 Dec 2024 20:44:32 +0100 Subject: make format --- src/crepe/Particle.h | 3 ++- src/crepe/api/ParticleEmitter.cpp | 6 +++-- src/crepe/api/ParticleEmitter.h | 5 ++-- src/crepe/system/ParticleSystem.cpp | 10 ++++---- src/crepe/system/ParticleSystem.h | 1 - src/example/game.cpp | 31 ++++++++++++------------ src/example/rendering_particle.cpp | 1 - src/test/ParticleTest.cpp | 48 ++++++++++++++++++------------------- 8 files changed, 53 insertions(+), 52 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index 0170117..ee0cd66 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -41,7 +41,8 @@ public: * \param velocity The initial velocity of the particle. * \param angle The angle of the particle's trajectory or orientation. */ - void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, float angle); + void reset(unsigned int lifespan, const vec2 & position, const vec2 & velocity, + float angle); /** * \brief Updates the particle's state. * diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp index 1e9cfaa..4f54bbd 100644 --- a/src/crepe/api/ParticleEmitter.cpp +++ b/src/crepe/api/ParticleEmitter.cpp @@ -3,9 +3,11 @@ using namespace crepe; -ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data) +ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, + const Data & data) : Component(game_object_id), - sprite(sprite), data(data) { + sprite(sprite), + data(data) { for (size_t i = 0; i < this->data.max_particles; i++) { this->particles.emplace_back(); } diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index 5b8e8e3..be970f5 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -78,18 +78,19 @@ public: * \param game_object_id Identifier for the game object using this emitter. * \param data Configuration data defining particle properties. */ - ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite,const Data & data); + ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data); public: //! Configuration data for particle emission settings. Data data; + private: //! Only ParticleSystem can move and read particles friend ParticleSystem; //! Only RenderSystem can read particles friend RenderSystem; //! Saves time left over from last update event. - float spawn_accumulator = 0; + float spawn_accumulator = 0; //! collection of particles std::vector<Particle> particles; }; diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index f98f245..31a4e9e 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -31,8 +31,8 @@ void ParticleSystem::update() { while (emitter.spawn_accumulator >= 1.0) { this->emit_particle(emitter, transform); emitter.spawn_accumulator -= 1.0; - } - + } + // Update all particles for (Particle & particle : emitter.particles) { if (particle.active) { @@ -49,9 +49,11 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & constexpr float DEG_TO_RAD = M_PI / 180.0; vec2 initial_position = emitter.data.position + transform.position; - float random_angle = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); + float random_angle + = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); - float random_speed = this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed); + float random_speed + = this->generate_random_speed(emitter.data.min_speed, emitter.data.max_speed); float angle_radians = random_angle * DEG_TO_RAD; vec2 velocity diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index 95a2bd5..154521d 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -23,7 +23,6 @@ public: void update() override; private: - /** * \brief Emits a particle from the specified emitter based on its emission properties. * diff --git a/src/example/game.cpp b/src/example/game.cpp index 279648e..2d25153 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -261,24 +261,23 @@ public: = false; Asset img5{"asset/texture/square.png"}; - - GameObject particle = mgr.new_object( "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); - auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{.size = {5, 5},}); - auto & test = particle.add_component<ParticleEmitter>(particle_image,ParticleEmitter::Data{ - .position = {0, 0}, - .max_particles = 256, - .emission_rate = 50, - .min_speed = 10, - .max_speed = 20, - .min_angle = -20, - .max_angle = 20, - .begin_lifespan = 0, - .end_lifespan = 5, - } - ); - + auto & particle_image = particle.add_component<Sprite>(img5, Sprite::Data{ + .size = {5, 5}, + }); + auto & test + = particle.add_component<ParticleEmitter>(particle_image, ParticleEmitter::Data{ + .position = {0, 0}, + .max_particles = 256, + .emission_rate = 50, + .min_speed = 10, + .max_speed = 20, + .min_angle = -20, + .max_angle = 20, + .begin_lifespan = 0, + .end_lifespan = 5, + }); } string get_name() const { return "scene1"; } diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 2b5c041..add43f4 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -17,7 +17,6 @@ using namespace crepe; using namespace std; - class TestScene : public Scene { public: diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index a9a26c6..8ffb140 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -1,6 +1,4 @@ #include "api/Asset.h" -#include <math.h> -#include <gtest/gtest.h> #include <crepe/api/Config.h> #include <crepe/api/GameObject.h> #include <crepe/api/Rigidbody.h> @@ -8,18 +6,18 @@ #include <crepe/api/Transform.h> #include <crepe/manager/ComponentManager.h> #include <crepe/manager/LoopTimerManager.h> +#include <gtest/gtest.h> +#include <math.h> #define protected public #define private public #include <crepe/Particle.h> #include <crepe/api/ParticleEmitter.h> #include <crepe/system/ParticleSystem.h> - using namespace std; using namespace std::chrono_literals; using namespace crepe; - class ParticlesTest : public ::testing::Test { Mediator m; @@ -44,25 +42,25 @@ public: .size = {10, 10}, }); - game_object.add_component<ParticleEmitter>(test_sprite,ParticleEmitter::Data{ - .position = {0, 0}, - .max_particles = 100, - .emission_rate = 0, - .min_speed = 0, - .max_speed = 0, - .min_angle = 0, - .max_angle = 0, - .begin_lifespan = 0, - .end_lifespan = 0, - .force_over_time = vec2{0, 0}, - .boundary{ - .width = 0, - .height = 0, - .offset = vec2{0, 0}, - .reset_on_exit = false, - }, - }); - + game_object.add_component<ParticleEmitter>(test_sprite, + ParticleEmitter::Data{ + .position = {0, 0}, + .max_particles = 100, + .emission_rate = 0, + .min_speed = 0, + .max_speed = 0, + .min_angle = 0, + .max_angle = 0, + .begin_lifespan = 0, + .end_lifespan = 0, + .force_over_time = vec2{0, 0}, + .boundary{ + .width = 0, + .height = 0, + .offset = vec2{0, 0}, + .reset_on_exit = false, + }, + }); } transforms = mgr.get_components_by_id<Transform>(0); Transform & transform = transforms.front().get(); @@ -209,6 +207,6 @@ TEST_F(ParticlesTest, boundaryParticleStop) { EXPECT_NEAR(std::abs(emitter.particles[0].position.x), emitter.data.boundary.height / 2, TOLERANCE); if (emitter.particles[0].velocity.y != 0) - EXPECT_NEAR(std::abs(emitter.particles[0].position.y), - emitter.data.boundary.width / 2, TOLERANCE); + EXPECT_NEAR(std::abs(emitter.particles[0].position.y), emitter.data.boundary.width / 2, + TOLERANCE); } -- cgit v1.2.3 From ccbfb97a11cd931655f2762443ffc36f5f25e86f Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sat, 14 Dec 2024 12:38:22 +0100 Subject: removed sdlcontext from header and implemented initiliser list for EventData --- src/crepe/api/Event.h | 10 +-- src/crepe/api/KeyCodes.h | 4 +- src/crepe/api/Script.cpp | 7 +- src/crepe/api/Script.h | 10 ++- src/crepe/facade/EventData.h | 55 ++++++++++++ src/crepe/facade/SDLContext.cpp | 188 +++++++++++++++++++++------------------ src/crepe/facade/SDLContext.h | 80 ++++------------- src/crepe/system/InputSystem.cpp | 51 +++++------ src/crepe/system/InputSystem.h | 16 ++-- src/test/InputTest.cpp | 1 + 10 files changed, 228 insertions(+), 194 deletions(-) create mode 100644 src/crepe/facade/EventData.h (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 17ae809..d353a5b 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -39,7 +39,7 @@ public: */ class MousePressEvent : public Event { public: - //! mouse position + //! mouse position in game units vec2 mouse_pos = {0, 0}; //! The mouse button that was pressed. @@ -51,7 +51,7 @@ public: */ class MouseClickEvent : public Event { public: - //! mouse position + //! mouse position in game units vec2 mouse_pos = {0, 0}; //! The mouse button that was clicked. @@ -63,7 +63,7 @@ public: */ class MouseReleaseEvent : public Event { public: - //! mouse position + //! mouse position in game units vec2 mouse_pos = {0, 0}; //! The mouse button that was released. @@ -75,7 +75,7 @@ public: */ class MouseMoveEvent : public Event { public: - //! new mouse position + //! mouse position in game units vec2 mouse_pos = {0, 0}; //! The change in mouse position relative to the last position (in pixels). ivec2 mouse_delta = {0, 0}; @@ -86,7 +86,7 @@ public: */ class MouseScrollEvent : public Event { public: - //! mouse position when the scroll happened. + //! mouse position in game units when the scroll happened. vec2 mouse_pos = {0, 0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; diff --git a/src/crepe/api/KeyCodes.h b/src/crepe/api/KeyCodes.h index dc3219a..1b9573a 100644 --- a/src/crepe/api/KeyCodes.h +++ b/src/crepe/api/KeyCodes.h @@ -3,6 +3,7 @@ #include <unordered_map> namespace crepe { + //! Enumeration for mouse button inputs, including standard and extended buttons. enum class MouseButton { NONE = 0, //!< No mouse button input. @@ -154,5 +155,6 @@ enum class Keycode { /// \} MENU = 348, //!< Menu key. }; - +//! Typedef for keyboard state. +typedef std::unordered_map<Keycode, bool> keyboard_state_t; } // namespace crepe diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp index 753a9e3..7b56f61 100644 --- a/src/crepe/api/Script.cpp +++ b/src/crepe/api/Script.cpp @@ -1,7 +1,7 @@ #include <string> #include "../manager/SceneManager.h" - +#include "../facade/SDLContext.h" #include "Script.h" using namespace crepe; @@ -25,3 +25,8 @@ void Script::set_next_scene(const string & name) { } SaveManager & Script::get_save_manager() const { return this->mediator->save_manager; } + +const keyboard_state_t& Script::get_keyboard_state() const{ + SDLContext& sdl_context = this->mediator->sdl_context; + return sdl_context.get_keyboard_state(); +} diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 668e5d1..4fbf344 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -6,6 +6,7 @@ #include "../manager/Mediator.h" #include "../system/CollisionSystem.h" #include "../types.h" +#include "../api/KeyCodes.h" #include "../util/OptionalRef.h" namespace crepe { @@ -134,7 +135,14 @@ protected: //! Retrieve SaveManager reference SaveManager & get_save_manager() const; - + /** + * \brief Utility function to retrieve the keyboard state + * \see SDLContext::get_keyboard_state + * + * \return current keyboard state map with Keycode as key and bool as value(true = pressed, false = not pressed) + * + */ + const keyboard_state_t& get_keyboard_state() const; //! \} private: diff --git a/src/crepe/facade/EventData.h b/src/crepe/facade/EventData.h new file mode 100644 index 0000000..d0ca07f --- /dev/null +++ b/src/crepe/facade/EventData.h @@ -0,0 +1,55 @@ +#pragma once +#include "../api/KeyCodes.h" +#include "../types.h" +namespace crepe { +//! EventType enum for passing eventType + enum EventType { + NONE = 0, + MOUSE_DOWN, + MOUSE_UP, + MOUSE_MOVE, + MOUSE_WHEEL, + KEY_UP, + KEY_DOWN, + SHUTDOWN, + WINDOW_MINIMIZE, + WINDOW_MAXIMIZE, + WINDOW_FOCUS_GAIN, + WINDOW_FOCUS_LOST, + WINDOW_MOVE, + WINDOW_RESIZE, + WINDOW_EXPOSE, + }; + + //! Struct for storing key data. + struct KeyData { + Keycode key = Keycode::NONE; + bool key_repeat = false; + }; + + //! Struct for storing mouse data. + struct MouseData { + MouseButton mouse_button = MouseButton::NONE; + ivec2 mouse_position = {-1, -1}; + int scroll_direction = -1; + float scroll_delta = INFINITY; + ivec2 rel_mouse_move = {-1, -1}; + }; + + //! Struct for storing window data. + struct WindowData { + ivec2 move_delta; + ivec2 resize_dimension; + }; + + //! EventData struct for passing event data from facade + struct EventData { + EventType event_type = EventType::NONE; + union { + KeyData key_data; + MouseData mouse_data; + WindowData window_data; + } data; + + }; +} // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 7e19ede..bb65e3b 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -76,13 +76,16 @@ SDLContext::~SDLContext() { } Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { - auto it = LOOKUP_TABLE.find(sdl_key); - if (it != LOOKUP_TABLE.end()) { - return it->second; - } + if (!LOOKUP_TABLE.contains(sdl_key)) + return Keycode::NONE; + + return LOOKUP_TABLE.at(sdl_key); +} - return Keycode::NONE; +const keyboard_state_t& SDLContext::get_keyboard_state() const{ + return this->keyboard_state; } + void SDLContext::update_keyboard_state() { // Array to hold the key states (true if pressed, false if not) SDL_PumpEvents(); @@ -273,8 +276,8 @@ ivec2 SDLContext::get_size(const Texture & ctx) { return size; } -std::vector<SDLContext::EventData> SDLContext::get_events() { - std::vector<SDLContext::EventData> event_list; +std::vector<EventData> SDLContext::get_events() { + std::vector<EventData> event_list; SDL_Event event; const CameraAuxiliaryData & cam = this->cam_aux_data; while (SDL_PollEvent(&event)) { @@ -283,77 +286,83 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y; switch (event.type) { case SDL_QUIT: - event_list.push_back({.event_type = SDLContext::EventType::SHUTDOWN}); + event_list.push_back({.event_type = EventType::SHUTDOWN}); break; - case SDL_KEYDOWN: { + case SDL_KEYDOWN: this->update_keyboard_state(); - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::KEYDOWN; - transfer_event.data.key_data = KeyData{ - .key = sdl_to_keycode(event.key.keysym.scancode), - .key_repeat = event.key.repeat != 0, - }; - event_list.push_back(transfer_event); + event_list.push_back(EventData{ + .event_type = EventType::KEY_DOWN, + .data = { + .key_data = { + .key = this->sdl_to_keycode(event.key.keysym.scancode), + .key_repeat = event.key.repeat != 0, + }, + }, + }); break; - } - case SDL_KEYUP: { + case SDL_KEYUP: this->update_keyboard_state(); - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::KEYUP; - transfer_event.data.key_data = KeyData{ - .key = sdl_to_keycode(event.key.keysym.scancode), - .key_repeat = false, - }; - event_list.push_back(transfer_event); + event_list.push_back(EventData{ + .event_type = EventType::KEY_UP, + .data = { + .key_data = { + .key = this->sdl_to_keycode(event.key.keysym.scancode), + .key_repeat = event.key.repeat != 0, + }, + }, + }); break; - } - - case SDL_MOUSEBUTTONDOWN: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::MOUSEDOWN; - transfer_event.data.mouse_data = MouseData{ - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = mouse_pos, - }; - event_list.push_back(transfer_event); + + case SDL_MOUSEBUTTONDOWN: + event_list.push_back(EventData{ + .event_type = EventType::MOUSE_DOWN, + .data = { + .mouse_data = { + .mouse_button = this->sdl_to_mousebutton(event.button.button), + .mouse_position = mouse_pos, + }, + }, + }); break; - } - case SDL_MOUSEBUTTONUP: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::MOUSEUP; - transfer_event.data.mouse_data = MouseData{ - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = mouse_pos, - }; - event_list.push_back(transfer_event); + case SDL_MOUSEBUTTONUP: + event_list.push_back(EventData{ + .event_type = EventType::MOUSE_UP, + .data = { + .mouse_data = { + .mouse_button = this->sdl_to_mousebutton(event.button.button), + .mouse_position = mouse_pos, + }, + }, + }); break; - } - - case SDL_MOUSEMOTION: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::MOUSEMOVE; - transfer_event.data.mouse_data = MouseData{ - .mouse_position = mouse_pos, - .rel_mouse_move = {event.motion.xrel, event.motion.yrel}, - }; - event_list.push_back(transfer_event); + + case SDL_MOUSEMOTION: + event_list.push_back(EventData{ + .event_type = EventType::MOUSE_MOVE, + .data = { + .mouse_data = { + .mouse_position = mouse_pos, + .rel_mouse_move = {event.motion.xrel, event.motion.yrel}, + }, + }, + }); break; - } - - case SDL_MOUSEWHEEL: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::MOUSEWHEEL; - transfer_event.data.mouse_data = MouseData{ - .mouse_position = mouse_pos, - .scroll_direction = event.wheel.y < 0 ? -1 : 1, - .scroll_delta = event.wheel.preciseY, - }; - event_list.push_back(transfer_event); + + case SDL_MOUSEWHEEL: + event_list.push_back(EventData{ + .event_type = EventType::MOUSE_WHEEL, + .data = { + .mouse_data = { + .mouse_position = mouse_pos, + .scroll_direction = event.wheel.y < 0 ? -1 : 1, + .scroll_delta = event.wheel.preciseY, + }, + }, + }); break; - } case SDL_WINDOWEVENT: - handle_window_event(event.window, event_list); + this->handle_window_event(event.window, event_list); break; } } @@ -362,38 +371,43 @@ std::vector<SDLContext::EventData> SDLContext::get_events() { } void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, - std::vector<SDLContext::EventData> & event_list) { + std::vector<EventData> & event_list) { switch (window_event.event) { case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back(EventData{SDLContext::EventType::WINDOW_EXPOSE}); + event_list.push_back(EventData{EventType::WINDOW_EXPOSE}); break; - case SDL_WINDOWEVENT_RESIZED: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::WINDOW_RESIZE; - transfer_event.data.window_data - = WindowData{.resize_dimension = {window_event.data1, window_event.data2}}; - event_list.push_back(transfer_event); + case SDL_WINDOWEVENT_RESIZED: + event_list.push_back(EventData{ + .event_type = EventType::WINDOW_RESIZE, + .data = { + .window_data = { + .resize_dimension = {window_event.data1, window_event.data2} + }, + }, + }); break; - } - case SDL_WINDOWEVENT_MOVED: { - EventData transfer_event; - transfer_event.event_type = SDLContext::EventType::WINDOW_MOVE; - transfer_event.data.window_data - = WindowData{.move_delta = {window_event.data1, window_event.data2}}; - event_list.push_back(transfer_event); + case SDL_WINDOWEVENT_MOVED: + event_list.push_back(EventData{ + .event_type = EventType::WINDOW_MOVE, + .data = { + .window_data = { + .move_delta = {window_event.data1, window_event.data2} + }, + }, + }); break; - } + case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back(EventData{SDLContext::EventType::WINDOW_MINIMIZE}); + event_list.push_back(EventData{EventType::WINDOW_MINIMIZE}); break; case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back(EventData{SDLContext::EventType::WINDOW_MAXIMIZE}); + event_list.push_back(EventData{EventType::WINDOW_MAXIMIZE}); break; case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_GAIN}); + event_list.push_back(EventData{EventType::WINDOW_FOCUS_GAIN}); break; case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back(EventData{SDLContext::EventType::WINDOW_FOCUS_LOST}); + event_list.push_back(EventData{EventType::WINDOW_FOCUS_LOST}); break; } } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 7ccefeb..34a4a09 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -17,11 +17,11 @@ #include "api/KeyCodes.h" #include "api/Sprite.h" #include "api/Transform.h" +#include "../types.h" -#include "types.h" +#include "EventData.h" namespace crepe { - class Texture; class Mediator; @@ -71,61 +71,7 @@ public: }; public: - //! EventType enum for passing eventType - enum EventType { - NONE = 0, - MOUSEDOWN, - MOUSEUP, - MOUSEMOVE, - MOUSEWHEEL, - KEYUP, - KEYDOWN, - SHUTDOWN, - WINDOW_MINIMIZE, - WINDOW_MAXIMIZE, - WINDOW_FOCUS_GAIN, - WINDOW_FOCUS_LOST, - WINDOW_MOVE, - WINDOW_RESIZE, - WINDOW_EXPOSE, - }; - struct KeyData { - Keycode key = Keycode::NONE; - bool key_repeat = false; - }; - struct MouseData { - MouseButton mouse_button = MouseButton::NONE; - ivec2 mouse_position = {-1, -1}; - int scroll_direction = -1; - float scroll_delta = INFINITY; - ivec2 rel_mouse_move = {-1, -1}; - }; - struct WindowData { - ivec2 move_delta; - ivec2 resize_dimension; - }; - //! EventData struct for passing event data from facade - struct EventData { - SDLContext::EventType event_type = SDLContext::EventType::NONE; - - union EventDataUnion { - KeyData key_data; - MouseData mouse_data; - WindowData window_data; - - EventDataUnion() {} - ~EventDataUnion() {} - } data; - }; - /** - * \brief Retrieves the current state of the keyboard. - * - * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a - * specific key defined in the `Keycode` enum, and the value indicates whether - * the key is currently pressed (true) or not pressed (false). - * - */ - void update_keyboard_state(); + /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -161,7 +107,7 @@ public: * * \return Events that occurred since last call to `get_events()` */ - std::vector<SDLContext::EventData> get_events(); + std::vector<EventData> get_events(); /** * \brief Fills event_list with triggered window events * @@ -169,7 +115,7 @@ public: * */ void handle_window_event(const SDL_WindowEvent & window_event, - std::vector<SDLContext::EventData> & event_list); + std::vector<EventData> & event_list); /** * \brief Converts an SDL scan code to the custom Keycode type. * @@ -191,7 +137,8 @@ public: * \return The corresponding `MouseButton` value or `MouseButton::NONE` if the key is unrecognized */ MouseButton sdl_to_mousebutton(Uint8 sdl_button); - + const keyboard_state_t& get_keyboard_state() const; + public: /** * \brief Gets the current SDL ticks since the program started. @@ -288,7 +235,18 @@ private: CameraAuxiliaryData cam_aux_data; private: - std::unordered_map<Keycode, bool> keyboard_state; + /** + * \brief Retrieves the current state of the keyboard. + * + * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a + * specific key defined in the `Keycode` enum, and the value indicates whether + * the key is currently pressed (true) or not pressed (false). + * + */ + void update_keyboard_state(); + //! variable to store the state of each key (true = pressed, false = not pressed) + keyboard_state_t keyboard_state; + //! lookup table for converting SDL_SCANCODES to Keycodes const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE = {{SDL_SCANCODE_SPACE, Keycode::SPACE}, {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 8de700b..1427adf 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,7 +1,7 @@ #include "../api/Button.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" -#include "facade/SDLContext.h" +#include "../facade/SDLContext.h" #include "util/Log.h" #include "InputSystem.h" @@ -12,7 +12,7 @@ void InputSystem::update() { ComponentManager & mgr = this->mediator.component_manager; SDLContext & context = this->mediator.sdl_context; - std::vector<SDLContext::EventData> event_list = context.get_events(); + std::vector<EventData> event_list = context.get_events(); RefVector<Button> buttons = mgr.get_components_by_type<Button>(); RefVector<Camera> cameras = mgr.get_components_by_type<Camera>(); OptionalRef<Camera> curr_cam_ref; @@ -33,9 +33,12 @@ void InputSystem::update() { vec2 camera_origin = cam_transform.position + current_cam.data.postion_offset - (current_cam.viewport_size / 2); - for (const SDLContext::EventData & event : event_list) { + for (const EventData & event : event_list) { // Only calculate mouse coordinates for relevant events - if (this->is_mouse_event(event.event_type)) { + if (event.event_type == EventType::MOUSE_DOWN + || event.event_type == EventType::MOUSE_UP + || event.event_type == EventType::MOUSE_MOVE + || event.event_type == EventType::MOUSE_WHEEL) { this->handle_mouse_event(event, camera_origin, current_cam); } else { @@ -44,7 +47,7 @@ void InputSystem::update() { } } -void InputSystem::handle_mouse_event(const SDLContext::EventData & event, +void InputSystem::handle_mouse_event(const EventData & event, const vec2 & camera_origin, const Camera & current_cam) { EventManager & event_mgr = this->mediator.event_manager; vec2 adjusted_mouse; @@ -59,7 +62,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event, // Handle mouse-specific events switch (event.event_type) { - case SDLContext::EventType::MOUSEDOWN: + case EventType::MOUSE_DOWN: event_mgr.queue_event<MousePressEvent>({ .mouse_pos = adjusted_mouse, .button = event.data.mouse_data.mouse_button, @@ -68,7 +71,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event, this->last_mouse_button = event.data.mouse_data.mouse_button; break; - case SDLContext::EventType::MOUSEUP: { + case EventType::MOUSE_UP: { event_mgr.queue_event<MouseReleaseEvent>({ .mouse_pos = adjusted_mouse, .button = event.data.mouse_data.mouse_button, @@ -87,7 +90,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event, break; } - case SDLContext::EventType::MOUSEMOVE: + case EventType::MOUSE_MOVE: event_mgr.queue_event<MouseMoveEvent>({ .mouse_pos = adjusted_mouse, .mouse_delta = event.data.mouse_data.rel_mouse_move, @@ -95,7 +98,7 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event, this->handle_move(event, adjusted_mouse); break; - case SDLContext::EventType::MOUSEWHEEL: + case EventType::MOUSE_WHEEL: event_mgr.queue_event<MouseScrollEvent>({ .mouse_pos = adjusted_mouse, .scroll_direction = event.data.mouse_data.scroll_direction, @@ -108,41 +111,41 @@ void InputSystem::handle_mouse_event(const SDLContext::EventData & event, } } -void InputSystem::handle_non_mouse_event(const SDLContext::EventData & event) { +void InputSystem::handle_non_mouse_event(const EventData & event) { EventManager & event_mgr = this->mediator.event_manager; switch (event.event_type) { - case SDLContext::EventType::KEYDOWN: + case EventType::KEY_DOWN: event_mgr.queue_event<KeyPressEvent>( {.repeat = event.data.key_data.key_repeat, .key = event.data.key_data.key}); break; - case SDLContext::EventType::KEYUP: + case EventType::KEY_UP: event_mgr.queue_event<KeyReleaseEvent>({.key = event.data.key_data.key}); break; - case SDLContext::EventType::SHUTDOWN: + case EventType::SHUTDOWN: event_mgr.queue_event<ShutDownEvent>({}); break; - case SDLContext::EventType::WINDOW_EXPOSE: + case EventType::WINDOW_EXPOSE: event_mgr.queue_event<WindowExposeEvent>({}); break; - case SDLContext::EventType::WINDOW_RESIZE: + case EventType::WINDOW_RESIZE: event_mgr.queue_event<WindowResizeEvent>( WindowResizeEvent{.dimensions = event.data.window_data.resize_dimension}); break; - case SDLContext::EventType::WINDOW_MOVE: + case EventType::WINDOW_MOVE: event_mgr.queue_event<WindowMoveEvent>( {.delta_move = event.data.window_data.move_delta}); break; - case SDLContext::EventType::WINDOW_MINIMIZE: + case EventType::WINDOW_MINIMIZE: event_mgr.queue_event<WindowMinimizeEvent>({}); break; - case SDLContext::EventType::WINDOW_MAXIMIZE: + case EventType::WINDOW_MAXIMIZE: event_mgr.queue_event<WindowMaximizeEvent>({}); break; - case SDLContext::EventType::WINDOW_FOCUS_GAIN: + case EventType::WINDOW_FOCUS_GAIN: event_mgr.queue_event<WindowFocusGainEvent>({}); break; - case SDLContext::EventType::WINDOW_FOCUS_LOST: + case EventType::WINDOW_FOCUS_LOST: event_mgr.queue_event<WindowFocusLostEvent>({}); break; default: @@ -150,14 +153,8 @@ void InputSystem::handle_non_mouse_event(const SDLContext::EventData & event) { } } -bool InputSystem::is_mouse_event(SDLContext::EventType event_type) { - return (event_type == SDLContext::EventType::MOUSEDOWN - || event_type == SDLContext::EventType::MOUSEUP - || event_type == SDLContext::EventType::MOUSEMOVE - || event_type == SDLContext::EventType::MOUSEWHEEL); -} -void InputSystem::handle_move(const SDLContext::EventData & event_data, +void InputSystem::handle_move(const EventData & event_data, const vec2 & mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; diff --git a/src/crepe/system/InputSystem.h b/src/crepe/system/InputSystem.h index 63dfae5..eefd9fe 100644 --- a/src/crepe/system/InputSystem.h +++ b/src/crepe/system/InputSystem.h @@ -1,7 +1,8 @@ #pragma once #include "../api/Config.h" -#include "../facade/SDLContext.h" +#include "../facade/EventData.h" + #include "../types.h" #include "../util/OptionalRef.h" @@ -12,7 +13,6 @@ namespace crepe { class Camera; class Button; class Transform; - /** * \brief Handles the processing of input events created by SDLContext * @@ -37,12 +37,6 @@ private: //! Stores the last mouse button pressed. MouseButton last_mouse_button = MouseButton::NONE; - /** - * \brief Determines whether the given event type is a mouse event. - * \param event_type The event type to check. - * \return True if the event type corresponds to a mouse event, false otherwise. - */ - bool is_mouse_event(SDLContext::EventType event_type); /** * \brief Handles mouse-related events. * \param event The event data for the mouse event. @@ -52,7 +46,7 @@ private: * This method processes mouse events, adjusts the mouse position to world coordinates, * and triggers the appropriate mouse-specific event handling logic. */ - void handle_mouse_event(const SDLContext::EventData & event, const vec2 & camera_origin, + void handle_mouse_event(const EventData & event, const vec2 & camera_origin, const Camera & current_cam); /** * \brief Handles non-mouse-related events. @@ -61,7 +55,7 @@ private: * This method processes events that do not involve the mouse, such as keyboard events, * window events, and shutdown events, and triggers the corresponding event actions. */ - void handle_non_mouse_event(const SDLContext::EventData & event); + void handle_non_mouse_event(const EventData & event); /** * \brief Handles the mouse click event. * \param mouse_button The mouse button involved in the click. @@ -80,7 +74,7 @@ private: * * This method processes the mouse movement event and updates the button hover state. */ - void handle_move(const SDLContext::EventData & event_data, const vec2 & mouse_pos); + void handle_move(const EventData & event_data, const vec2 & mouse_pos); /** * \brief Checks if the mouse position is inside the bounds of the button. diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 09163a6..a707444 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -13,6 +13,7 @@ #include <crepe/api/Camera.h> #include <crepe/api/GameObject.h> #include <crepe/api/Metadata.h> +#include <crepe/facade/SDLContext.h> #include <crepe/api/Transform.h> #include <crepe/api/Vector2.h> #include <gmock/gmock.h> -- cgit v1.2.3 From 76d3108c44d6920c8f6f245c80c10a15267f1d3b Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 14 Dec 2024 13:14:01 +0100 Subject: change position to offset --- src/crepe/api/ParticleEmitter.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index be970f5..8ac2e72 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -49,8 +49,8 @@ public: * and the sprite used for rendering particles. */ struct Data { - //! position of the emitter - vec2 position; + //! offset of the emitter relative to transform + vec2 offset; //! maximum number of particles const unsigned int max_particles = 256; //! rate of particle emission per second -- cgit v1.2.3 From 1a5116b944bcbdeeb3474faefbe150e82f8697b1 Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 14 Dec 2024 13:24:14 +0100 Subject: updated api and game --- src/crepe/api/BoxCollider.cpp | 3 +-- src/crepe/api/BoxCollider.h | 2 +- src/crepe/api/CircleCollider.cpp | 3 +-- src/crepe/api/CircleCollider.h | 2 +- src/crepe/api/Rigidbody.h | 2 +- src/example/game.cpp | 26 ++++++++------------------ 6 files changed, 13 insertions(+), 25 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp index c097a24..302bdd2 100644 --- a/src/crepe/api/BoxCollider.cpp +++ b/src/crepe/api/BoxCollider.cpp @@ -4,7 +4,6 @@ using namespace crepe; -BoxCollider::BoxCollider(game_object_id_t game_object_id, const vec2 & offset, - const vec2 & dimensions) +BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2 & dimensions,const vec2 & offset) : Collider(game_object_id, offset), dimensions(dimensions) {} diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h index 1ac4d46..a507e0c 100644 --- a/src/crepe/api/BoxCollider.h +++ b/src/crepe/api/BoxCollider.h @@ -13,7 +13,7 @@ namespace crepe { */ class BoxCollider : public Collider { public: - BoxCollider(game_object_id_t game_object_id, const vec2 & offset, const vec2 & dimensions); + BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,const vec2 & offset= {0,0}); //! Width and height of the box collider vec2 dimensions; diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp index a4271e9..e542275 100644 --- a/src/crepe/api/CircleCollider.cpp +++ b/src/crepe/api/CircleCollider.cpp @@ -2,7 +2,6 @@ using namespace crepe; -CircleCollider::CircleCollider(game_object_id_t game_object_id, const vec2 & offset, - float radius) +CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset) : Collider(game_object_id, offset), radius(radius) {} diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h index c7bf66e..ea40068 100644 --- a/src/crepe/api/CircleCollider.h +++ b/src/crepe/api/CircleCollider.h @@ -13,7 +13,7 @@ namespace crepe { */ class CircleCollider : public Collider { public: - CircleCollider(game_object_id_t game_object_id, const vec2 & offset, float radius); + CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset= {0,0}); //! Radius of the circle collider. float radius; diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index b08c8db..6900295 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -139,7 +139,7 @@ public: * Each element represents a layer ID, and the GameObject will only detect * collisions with other GameObjects that belong to these layers. */ - std::set<int> collision_layers; + std::set<int> collision_layers = {0}; }; public: diff --git a/src/example/game.cpp b/src/example/game.cpp index 8ea50ea..60c9088 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -176,19 +176,11 @@ public: .gravity_scale = 0, .body_type = Rigidbody::BodyType::STATIC, .offset = {0, 0}, - .collision_layers = {0}, }); - world.add_component<BoxCollider>( - vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}, - vec2{world_collider, world_collider}); - ; // Top - world.add_component<BoxCollider>(vec2{0, screen_size_height / 2 + world_collider / 2}, - vec2{world_collider, world_collider}); // Bottom - world.add_component<BoxCollider>( - vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}, - vec2{world_collider, world_collider}); // Left - world.add_component<BoxCollider>(vec2{screen_size_width / 2 + world_collider / 2, 0}, - vec2{world_collider, world_collider}); // right + world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top + world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom + world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left + world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{screen_size_width / 2 + world_collider / 2, 0}); // right world.add_component<Camera>( ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, vec2{screen_size_width, screen_size_height}, @@ -207,10 +199,9 @@ public: .constraints = {0, 0, 0}, .elastisity_coefficient = 1, .offset = {0, 0}, - .collision_layers = {0}, }); // add box with boxcollider - game_object1.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20}); + game_object1.add_component<BoxCollider>(vec2{20, 20}); game_object1.add_component<BehaviorScript>().set_script<MyScript1>(); Asset img1{"asset/texture/square.png"}; @@ -219,7 +210,7 @@ public: }); //add circle with cirlcecollider deactiveated - game_object1.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + game_object1.add_component<CircleCollider>(10).active = false; Asset img2{"asset/texture/circle.png"}; game_object1 .add_component<Sprite>(img2, @@ -239,10 +230,9 @@ public: .constraints = {0, 0, 0}, .elastisity_coefficient = 1, .offset = {0, 0}, - .collision_layers = {0}, }); // add box with boxcollider - game_object2.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20}); + game_object2.add_component<BoxCollider>(vec2{20, 20}); game_object2.add_component<BehaviorScript>().set_script<MyScript2>(); game_object2.add_component<Sprite>(img1, Sprite::Data{ @@ -250,7 +240,7 @@ public: }); //add circle with cirlcecollider deactiveated - game_object2.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + game_object2.add_component<CircleCollider>(10).active = false; game_object2 .add_component<Sprite>(img2, -- cgit v1.2.3 From c17233b10bd8e35bead60c5f44bb8a14836d755f Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sat, 14 Dec 2024 13:49:40 +0100 Subject: keyboard state working --- src/crepe/api/Event.h | 2 +- src/crepe/facade/SDLContext.cpp | 13 +++-------- src/crepe/facade/SDLContext.h | 20 ++++++++-------- src/example/button.cpp | 51 ++++++++++++++++++++++------------------- src/test/InputTest.cpp | 1 + 5 files changed, 42 insertions(+), 45 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index d353a5b..4e57b45 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -3,7 +3,7 @@ #include <string> -#include "KeyCodes.h" +#include "api/KeyCodes.h" #include "types.h" namespace crepe { diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index bb65e3b..e5b0284 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,7 +6,6 @@ #include <SDL2/SDL_rect.h> #include <SDL2/SDL_render.h> #include <SDL2/SDL_surface.h> -#include <SDL2/SDL_video.h> #include <array> #include <cmath> #include <cstddef> @@ -82,22 +81,18 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return LOOKUP_TABLE.at(sdl_key); } -const keyboard_state_t& SDLContext::get_keyboard_state() const{ - return this->keyboard_state; -} - -void SDLContext::update_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) +const keyboard_state_t& SDLContext::get_keyboard_state(){ SDL_PumpEvents(); const Uint8 * current_state = SDL_GetKeyboardState(nullptr); for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); - if (key != Keycode::NONE) { this->keyboard_state[key] = current_state[i] != 0; } } + return this->keyboard_state; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -289,7 +284,6 @@ std::vector<EventData> SDLContext::get_events() { event_list.push_back({.event_type = EventType::SHUTDOWN}); break; case SDL_KEYDOWN: - this->update_keyboard_state(); event_list.push_back(EventData{ .event_type = EventType::KEY_DOWN, .data = { @@ -302,7 +296,6 @@ std::vector<EventData> SDLContext::get_events() { break; case SDL_KEYUP: - this->update_keyboard_state(); event_list.push_back(EventData{ .event_type = EventType::KEY_UP, .data = { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 34a4a09..3531680 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -137,7 +137,16 @@ public: * \return The corresponding `MouseButton` value or `MouseButton::NONE` if the key is unrecognized */ MouseButton sdl_to_mousebutton(Uint8 sdl_button); - const keyboard_state_t& get_keyboard_state() const; + /** + * \brief Gets the current state of the keyboard. + * + * Updates the internal keyboard state by checking the current key states using + * SDL's `SDL_GetKeyboardState()`, and returns a reference to the `keyboard_state_t`. + * + * \return A constant reference to the `keyboard_state_t`, which holds the state + * of each key (true = pressed, false = not pressed). + */ + const keyboard_state_t& get_keyboard_state(); public: /** @@ -235,15 +244,6 @@ private: CameraAuxiliaryData cam_aux_data; private: - /** - * \brief Retrieves the current state of the keyboard. - * - * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a - * specific key defined in the `Keycode` enum, and the value indicates whether - * the key is currently pressed (true) or not pressed (false). - * - */ - void update_keyboard_state(); //! variable to store the state of each key (true = pressed, false = not pressed) keyboard_state_t keyboard_state; //! lookup table for converting SDL_SCANCODES to Keycodes diff --git a/src/example/button.cpp b/src/example/button.cpp index f2e77f6..c4e9a47 100644 --- a/src/example/button.cpp +++ b/src/example/button.cpp @@ -1,17 +1,18 @@ #include <SDL2/SDL_timer.h> #include <chrono> #include <crepe/Component.h> -#include <crepe/ComponentManager.h> +#include <crepe/manager/ComponentManager.h> #include <crepe/api/Animator.h> #include <crepe/api/Button.h> #include <crepe/api/Camera.h> #include <crepe/api/Color.h> -#include <crepe/api/EventManager.h> +#include <crepe/manager/EventManager.h> #include <crepe/api/GameObject.h> #include <crepe/api/Sprite.h> #include <crepe/api/Texture.h> #include <crepe/api/Transform.h> #include <crepe/system/AnimatorSystem.h> +#include <crepe/facade/SDLContext.h> #include <crepe/system/InputSystem.h> #include <crepe/system/RenderSystem.h> #include <crepe/types.h> @@ -19,33 +20,35 @@ using namespace crepe; using namespace std; int main(int argc, char * argv[]) { - ComponentManager mgr; - RenderSystem sys{mgr}; - EventManager & event_mgr = EventManager::get_instance(); - InputSystem input_sys{mgr}; - AnimatorSystem asys{mgr}; - GameObject camera_obj = mgr.new_object("", "", vec2{1000, 1000}, 0, 1); - camera_obj.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); + Mediator mediator; + ComponentManager mgr{mediator}; + RenderSystem sys{mediator}; + EventManager event_mgr{mediator}; + InputSystem input_sys{mediator}; + SDLContext sdl_context{mediator}; + GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); + auto & camera = obj.add_component<Camera>(ivec2{500, 500}, vec2{500, 500}, + Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); - auto s2 = Texture("asset/texture/test_ap43.png"); - bool button_clicked = false; - auto & sprite2 = button_obj.add_component<Sprite>( - s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100); - std::function<void()> on_click = [&]() { std::cout << "button clicked" << std::endl; }; - std::function<void()> on_enter = [&]() { std::cout << "enter" << std::endl; }; - std::function<void()> on_exit = [&]() { std::cout << "exit" << std::endl; }; - auto & button - = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); - button.on_mouse_enter = on_enter; - button.on_mouse_exit = on_exit; - button.is_toggle = true; - button.active = true; + // GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); + // auto s2 = Texture("asset/texture/test_ap43.png"); + // bool button_clicked = false; + // auto & sprite2 = button_obj.add_component<Sprite>( + // s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100); + // std::function<void()> on_click = [&]() { std::cout << "button clicked" << std::endl; }; + // std::function<void()> on_enter = [&]() { std::cout << "enter" << std::endl; }; + // std::function<void()> on_exit = [&]() { std::cout << "exit" << std::endl; }; + // auto & button + // = button_obj.add_component<Button>(vec2{100, 100}, vec2{0, 0}, on_click, false); + // button.on_mouse_enter = on_enter; + // button.on_mouse_exit = on_exit; + // button.is_toggle = true; + // button.active = true; auto start = std::chrono::steady_clock::now(); while (true) { + const keyboard_state_t& keyboard_state = sdl_context.get_keyboard_state(); input_sys.update(); sys.update(); - asys.update(); event_mgr.dispatch_events(); SDL_Delay(30); } diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index a707444..f974d0c 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -260,3 +260,4 @@ TEST_F(InputTest, testButtonHover) { event_manager.dispatch_events(); EXPECT_TRUE(button.hover); } + -- cgit v1.2.3 From dbe779ca850ec0bf5d9b5066a7a6df44f3762e4d Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sat, 14 Dec 2024 13:52:56 +0100 Subject: make format --- src/crepe/api/Event.h | 10 ++--- src/crepe/api/Script.cpp | 6 +-- src/crepe/api/Script.h | 4 +- src/crepe/facade/EventData.h | 89 ++++++++++++++++++++-------------------- src/crepe/facade/SDLContext.cpp | 9 ++-- src/crepe/facade/SDLContext.h | 8 ++-- src/crepe/system/InputSystem.cpp | 10 ++--- src/example/button.cpp | 12 +++--- src/test/InputTest.cpp | 3 +- 9 files changed, 72 insertions(+), 79 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 4e57b45..73bf461 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -39,7 +39,7 @@ public: */ class MousePressEvent : public Event { public: - //! mouse position in game units + //! mouse position in world coordinates (game units). vec2 mouse_pos = {0, 0}; //! The mouse button that was pressed. @@ -51,7 +51,7 @@ public: */ class MouseClickEvent : public Event { public: - //! mouse position in game units + //! mouse position in world coordinates (game units). vec2 mouse_pos = {0, 0}; //! The mouse button that was clicked. @@ -63,7 +63,7 @@ public: */ class MouseReleaseEvent : public Event { public: - //! mouse position in game units + //! mouse position in world coordinates (game units). vec2 mouse_pos = {0, 0}; //! The mouse button that was released. @@ -75,7 +75,7 @@ public: */ class MouseMoveEvent : public Event { public: - //! mouse position in game units + //! mouse position in world coordinates (game units). vec2 mouse_pos = {0, 0}; //! The change in mouse position relative to the last position (in pixels). ivec2 mouse_delta = {0, 0}; @@ -86,7 +86,7 @@ public: */ class MouseScrollEvent : public Event { public: - //! mouse position in game units when the scroll happened. + //! mouse position in world coordinates (game units) when the scroll happened. vec2 mouse_pos = {0, 0}; //! scroll direction (-1 = down, 1 = up) int scroll_direction = 0; diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp index 7b56f61..638cca7 100644 --- a/src/crepe/api/Script.cpp +++ b/src/crepe/api/Script.cpp @@ -1,7 +1,7 @@ #include <string> -#include "../manager/SceneManager.h" #include "../facade/SDLContext.h" +#include "../manager/SceneManager.h" #include "Script.h" using namespace crepe; @@ -26,7 +26,7 @@ void Script::set_next_scene(const string & name) { SaveManager & Script::get_save_manager() const { return this->mediator->save_manager; } -const keyboard_state_t& Script::get_keyboard_state() const{ - SDLContext& sdl_context = this->mediator->sdl_context; +const keyboard_state_t & Script::get_keyboard_state() const { + SDLContext & sdl_context = this->mediator->sdl_context; return sdl_context.get_keyboard_state(); } diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 4fbf344..dcecc07 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -2,11 +2,11 @@ #include <vector> +#include "../api/KeyCodes.h" #include "../manager/EventManager.h" #include "../manager/Mediator.h" #include "../system/CollisionSystem.h" #include "../types.h" -#include "../api/KeyCodes.h" #include "../util/OptionalRef.h" namespace crepe { @@ -142,7 +142,7 @@ protected: * \return current keyboard state map with Keycode as key and bool as value(true = pressed, false = not pressed) * */ - const keyboard_state_t& get_keyboard_state() const; + const keyboard_state_t & get_keyboard_state() const; //! \} private: diff --git a/src/crepe/facade/EventData.h b/src/crepe/facade/EventData.h index d0ca07f..a7526b4 100644 --- a/src/crepe/facade/EventData.h +++ b/src/crepe/facade/EventData.h @@ -3,53 +3,52 @@ #include "../types.h" namespace crepe { //! EventType enum for passing eventType - enum EventType { - NONE = 0, - MOUSE_DOWN, - MOUSE_UP, - MOUSE_MOVE, - MOUSE_WHEEL, - KEY_UP, - KEY_DOWN, - SHUTDOWN, - WINDOW_MINIMIZE, - WINDOW_MAXIMIZE, - WINDOW_FOCUS_GAIN, - WINDOW_FOCUS_LOST, - WINDOW_MOVE, - WINDOW_RESIZE, - WINDOW_EXPOSE, - }; +enum EventType { + NONE = 0, + MOUSE_DOWN, + MOUSE_UP, + MOUSE_MOVE, + MOUSE_WHEEL, + KEY_UP, + KEY_DOWN, + SHUTDOWN, + WINDOW_MINIMIZE, + WINDOW_MAXIMIZE, + WINDOW_FOCUS_GAIN, + WINDOW_FOCUS_LOST, + WINDOW_MOVE, + WINDOW_RESIZE, + WINDOW_EXPOSE, +}; - //! Struct for storing key data. - struct KeyData { - Keycode key = Keycode::NONE; - bool key_repeat = false; - }; +//! Struct for storing key data. +struct KeyData { + Keycode key = Keycode::NONE; + bool key_repeat = false; +}; - //! Struct for storing mouse data. - struct MouseData { - MouseButton mouse_button = MouseButton::NONE; - ivec2 mouse_position = {-1, -1}; - int scroll_direction = -1; - float scroll_delta = INFINITY; - ivec2 rel_mouse_move = {-1, -1}; - }; +//! Struct for storing mouse data. +struct MouseData { + MouseButton mouse_button = MouseButton::NONE; + ivec2 mouse_position = {-1, -1}; + int scroll_direction = -1; + float scroll_delta = INFINITY; + ivec2 rel_mouse_move = {-1, -1}; +}; - //! Struct for storing window data. - struct WindowData { - ivec2 move_delta; - ivec2 resize_dimension; - }; - - //! EventData struct for passing event data from facade - struct EventData { - EventType event_type = EventType::NONE; - union { - KeyData key_data; - MouseData mouse_data; - WindowData window_data; - } data; +//! Struct for storing window data. +struct WindowData { + ivec2 move_delta; + ivec2 resize_dimension; +}; - }; +//! EventData struct for passing event data from facade +struct EventData { + EventType event_type = EventType::NONE; + union { + KeyData key_data; + MouseData mouse_data; + WindowData window_data; + } data; +}; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index e5b0284..7ccc243 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -75,18 +75,17 @@ SDLContext::~SDLContext() { } Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { - if (!LOOKUP_TABLE.contains(sdl_key)) - return Keycode::NONE; + if (!LOOKUP_TABLE.contains(sdl_key)) return Keycode::NONE; return LOOKUP_TABLE.at(sdl_key); } -const keyboard_state_t& SDLContext::get_keyboard_state(){ +const keyboard_state_t & SDLContext::get_keyboard_state() { SDL_PumpEvents(); const Uint8 * current_state = SDL_GetKeyboardState(nullptr); for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - + Keycode key = sdl_to_keycode(static_cast<SDL_Scancode>(i)); if (key != Keycode::NONE) { this->keyboard_state[key] = current_state[i] != 0; @@ -283,7 +282,7 @@ std::vector<EventData> SDLContext::get_events() { case SDL_QUIT: event_list.push_back({.event_type = EventType::SHUTDOWN}); break; - case SDL_KEYDOWN: + case SDL_KEYDOWN: event_list.push_back(EventData{ .event_type = EventType::KEY_DOWN, .data = { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 3531680..8f4760e 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -5,19 +5,18 @@ #include <SDL2/SDL_rect.h> #include <SDL2/SDL_render.h> #include <SDL2/SDL_video.h> -#include <array> #include <cmath> #include <functional> #include <memory> #include <string> #include <unordered_map> +#include "../types.h" #include "api/Camera.h" #include "api/Color.h" #include "api/KeyCodes.h" #include "api/Sprite.h" #include "api/Transform.h" -#include "../types.h" #include "EventData.h" @@ -71,7 +70,6 @@ public: }; public: - /** * \brief Gets the singleton instance of SDLContext. * \return Reference to the SDLContext instance. @@ -146,8 +144,8 @@ public: * \return A constant reference to the `keyboard_state_t`, which holds the state * of each key (true = pressed, false = not pressed). */ - const keyboard_state_t& get_keyboard_state(); - + const keyboard_state_t & get_keyboard_state(); + public: /** * \brief Gets the current SDL ticks since the program started. diff --git a/src/crepe/system/InputSystem.cpp b/src/crepe/system/InputSystem.cpp index 1427adf..fca540f 100644 --- a/src/crepe/system/InputSystem.cpp +++ b/src/crepe/system/InputSystem.cpp @@ -1,7 +1,7 @@ #include "../api/Button.h" +#include "../facade/SDLContext.h" #include "../manager/ComponentManager.h" #include "../manager/EventManager.h" -#include "../facade/SDLContext.h" #include "util/Log.h" #include "InputSystem.h" @@ -47,8 +47,8 @@ void InputSystem::update() { } } -void InputSystem::handle_mouse_event(const EventData & event, - const vec2 & camera_origin, const Camera & current_cam) { +void InputSystem::handle_mouse_event(const EventData & event, const vec2 & camera_origin, + const Camera & current_cam) { EventManager & event_mgr = this->mediator.event_manager; vec2 adjusted_mouse; adjusted_mouse.x = event.data.mouse_data.mouse_position.x + camera_origin.x; @@ -153,9 +153,7 @@ void InputSystem::handle_non_mouse_event(const EventData & event) { } } - -void InputSystem::handle_move(const EventData & event_data, - const vec2 & mouse_pos) { +void InputSystem::handle_move(const EventData & event_data, const vec2 & mouse_pos) { ComponentManager & mgr = this->mediator.component_manager; RefVector<Button> buttons = mgr.get_components_by_type<Button>(); diff --git a/src/example/button.cpp b/src/example/button.cpp index c4e9a47..6c8b1bc 100644 --- a/src/example/button.cpp +++ b/src/example/button.cpp @@ -1,18 +1,18 @@ #include <SDL2/SDL_timer.h> #include <chrono> #include <crepe/Component.h> -#include <crepe/manager/ComponentManager.h> #include <crepe/api/Animator.h> #include <crepe/api/Button.h> #include <crepe/api/Camera.h> #include <crepe/api/Color.h> -#include <crepe/manager/EventManager.h> #include <crepe/api/GameObject.h> #include <crepe/api/Sprite.h> #include <crepe/api/Texture.h> #include <crepe/api/Transform.h> -#include <crepe/system/AnimatorSystem.h> #include <crepe/facade/SDLContext.h> +#include <crepe/manager/ComponentManager.h> +#include <crepe/manager/EventManager.h> +#include <crepe/system/AnimatorSystem.h> #include <crepe/system/InputSystem.h> #include <crepe/system/RenderSystem.h> #include <crepe/types.h> @@ -27,8 +27,8 @@ int main(int argc, char * argv[]) { InputSystem input_sys{mediator}; SDLContext sdl_context{mediator}; GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); - auto & camera = obj.add_component<Camera>(ivec2{500, 500}, vec2{500, 500}, - Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); + auto & camera = obj.add_component<Camera>( + ivec2{500, 500}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); // GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); // auto s2 = Texture("asset/texture/test_ap43.png"); @@ -46,7 +46,7 @@ int main(int argc, char * argv[]) { // button.active = true; auto start = std::chrono::steady_clock::now(); while (true) { - const keyboard_state_t& keyboard_state = sdl_context.get_keyboard_state(); + const keyboard_state_t & keyboard_state = sdl_context.get_keyboard_state(); input_sys.update(); sys.update(); event_mgr.dispatch_events(); diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index f974d0c..d893276 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -13,9 +13,9 @@ #include <crepe/api/Camera.h> #include <crepe/api/GameObject.h> #include <crepe/api/Metadata.h> -#include <crepe/facade/SDLContext.h> #include <crepe/api/Transform.h> #include <crepe/api/Vector2.h> +#include <crepe/facade/SDLContext.h> #include <gmock/gmock.h> using namespace std; @@ -260,4 +260,3 @@ TEST_F(InputTest, testButtonHover) { event_manager.dispatch_events(); EXPECT_TRUE(button.hover); } - -- cgit v1.2.3 From 4cddaf8e8b809a69a8e03e79c4f7902920745a9a Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 14 Dec 2024 18:23:31 +0100 Subject: make format --- src/crepe/api/BoxCollider.cpp | 3 ++- src/crepe/api/BoxCollider.h | 3 ++- src/crepe/api/CircleCollider.cpp | 3 ++- src/crepe/api/CircleCollider.h | 3 ++- src/example/game.cpp | 18 +++++++++++++----- src/test/CollisionTest.cpp | 12 ++++++------ 6 files changed, 27 insertions(+), 15 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp index 302bdd2..a893d41 100644 --- a/src/crepe/api/BoxCollider.cpp +++ b/src/crepe/api/BoxCollider.cpp @@ -4,6 +4,7 @@ using namespace crepe; -BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2 & dimensions,const vec2 & offset) +BoxCollider::BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions, + const vec2 & offset) : Collider(game_object_id, offset), dimensions(dimensions) {} diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h index a507e0c..d643e7f 100644 --- a/src/crepe/api/BoxCollider.h +++ b/src/crepe/api/BoxCollider.h @@ -13,7 +13,8 @@ namespace crepe { */ class BoxCollider : public Collider { public: - BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions,const vec2 & offset= {0,0}); + BoxCollider(game_object_id_t game_object_id, const vec2 & dimensions, + const vec2 & offset = {0, 0}); //! Width and height of the box collider vec2 dimensions; diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp index e542275..90ab5e7 100644 --- a/src/crepe/api/CircleCollider.cpp +++ b/src/crepe/api/CircleCollider.cpp @@ -2,6 +2,7 @@ using namespace crepe; -CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset) +CircleCollider::CircleCollider(game_object_id_t game_object_id, float radius, + const vec2 & offset) : Collider(game_object_id, offset), radius(radius) {} diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h index ea40068..22da836 100644 --- a/src/crepe/api/CircleCollider.h +++ b/src/crepe/api/CircleCollider.h @@ -13,7 +13,8 @@ namespace crepe { */ class CircleCollider : public Collider { public: - CircleCollider(game_object_id_t game_object_id, float radius, const vec2 & offset= {0,0}); + CircleCollider(game_object_id_t game_object_id, float radius, + const vec2 & offset = {0, 0}); //! Radius of the circle collider. float radius; diff --git a/src/example/game.cpp b/src/example/game.cpp index d03d78d..61f8760 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -36,7 +36,7 @@ class MyScript1 : public Script { case Keycode::W: { Rigidbody & tf = this->get_component<Rigidbody>(); // tf.data.linear_velocity.y -= 1; - tf.add_force_linear({0,-1}); + tf.add_force_linear({0, -1}); break; } case Keycode::S: { @@ -178,10 +178,18 @@ public: .body_type = Rigidbody::BodyType::STATIC, .offset = {0, 0}, }); - world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top - world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom - world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left - world.add_component<BoxCollider>(vec2{world_collider, world_collider},vec2{screen_size_width / 2 + world_collider / 2, 0}); // right + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left + world.add_component<BoxCollider>( + vec2{world_collider, world_collider}, + vec2{screen_size_width / 2 + world_collider / 2, 0}); // right world.add_component<Camera>( ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, vec2{screen_size_width, screen_size_height}, diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp index b34bede..ff9e7cc 100644 --- a/src/test/CollisionTest.cpp +++ b/src/test/CollisionTest.cpp @@ -69,10 +69,10 @@ public: .offset = {0, 0}, }); // Create a box with an inner size of 10x10 units - world.add_component<BoxCollider>(vec2{100, 100},vec2{0, -100}); // Top - world.add_component<BoxCollider>(vec2{100, 100},vec2{0, 100}); // Bottom - world.add_component<BoxCollider>(vec2{100, 100},vec2{-100, 0}); // Left - world.add_component<BoxCollider>(vec2{100, 100},vec2{100, 0}); // right + world.add_component<BoxCollider>(vec2{100, 100}, vec2{0, -100}); // Top + world.add_component<BoxCollider>(vec2{100, 100}, vec2{0, 100}); // Bottom + world.add_component<BoxCollider>(vec2{100, 100}, vec2{-100, 0}); // Left + world.add_component<BoxCollider>(vec2{100, 100}, vec2{100, 0}); // right game_object1.add_component<Rigidbody>(Rigidbody::Data{ .mass = 1, @@ -84,7 +84,7 @@ public: .offset = {0, 0}, .collision_layers = {0}, }); - game_object1.add_component<BoxCollider>(vec2{10, 10},vec2{0, 0}); + game_object1.add_component<BoxCollider>(vec2{10, 10}, vec2{0, 0}); BehaviorScript & script_object1 = game_object1.add_component<BehaviorScript>().set_script<CollisionHandler>(1); script_object1_ref = static_cast<CollisionHandler *>(script_object1.script.get()); @@ -100,7 +100,7 @@ public: .offset = {0, 0}, .collision_layers = {0}, }); - game_object2.add_component<BoxCollider>(vec2{10, 10},vec2{0, 0}); + game_object2.add_component<BoxCollider>(vec2{10, 10}, vec2{0, 0}); BehaviorScript & script_object2 = game_object2.add_component<BehaviorScript>().set_script<CollisionHandler>(2); script_object2_ref = static_cast<CollisionHandler *>(script_object2.script.get()); -- cgit v1.2.3 From ff2f5120b53792fe5e8cfd45a4335680baf487cf Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 14 Dec 2024 20:00:40 +0100 Subject: updated offset --- src/crepe/system/ParticleSystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 31a4e9e..e61f0ce 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -48,7 +48,7 @@ void ParticleSystem::update() { void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & transform) { constexpr float DEG_TO_RAD = M_PI / 180.0; - vec2 initial_position = emitter.data.position + transform.position; + vec2 initial_position = emitter.data.offset + transform.position; float random_angle = this->generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); @@ -69,7 +69,7 @@ void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform & } void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform & transform) { - vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position; + vec2 offset = emitter.data.boundary.offset + transform.position + emitter.data.offset; float half_width = emitter.data.boundary.width / 2.0; float half_height = emitter.data.boundary.height / 2.0; -- cgit v1.2.3 From 20d19e3c714d3e8ca3e35c170c07c563ecc719bb Mon Sep 17 00:00:00 2001 From: JAROWMR <jarorutjes07@gmail.com> Date: Sat, 14 Dec 2024 21:30:32 +0100 Subject: fixed bug with lower than one particle per second --- src/crepe/system/ParticleSystem.cpp | 2 +- src/example/game.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index e61f0ce..35a1d41 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -27,7 +27,7 @@ void ParticleSystem::update() { = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); // Emit particles based on emission_rate - emitter.spawn_accumulator = emitter.data.emission_rate * dt; + emitter.spawn_accumulator += emitter.data.emission_rate * dt; while (emitter.spawn_accumulator >= 1.0) { this->emit_particle(emitter, transform); emitter.spawn_accumulator -= 1.0; diff --git a/src/example/game.cpp b/src/example/game.cpp index ed6afac..db0d04b 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -271,7 +271,7 @@ public: = particle.add_component<ParticleEmitter>(particle_image, ParticleEmitter::Data{ .offset = {0, 0}, .max_particles = 256, - .emission_rate = 50, + .emission_rate = 1, .min_speed = 10, .max_speed = 20, .min_angle = -20, -- cgit v1.2.3 From ff969f4e676d8cb565da1581733a35eb64eb03c6 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sun, 15 Dec 2024 22:43:37 +0100 Subject: added keystate --- src/crepe/api/Script.cpp | 8 ++++++++ src/crepe/api/Script.h | 8 ++++++++ 2 files changed, 16 insertions(+) (limited to 'src/crepe') diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp index 638cca7..4cd59a5 100644 --- a/src/crepe/api/Script.cpp +++ b/src/crepe/api/Script.cpp @@ -30,3 +30,11 @@ const keyboard_state_t & Script::get_keyboard_state() const { SDLContext & sdl_context = this->mediator->sdl_context; return sdl_context.get_keyboard_state(); } +bool Script::get_key_state(Keycode key) const{ + try { + return this->get_keyboard_state().at(key); + } catch (...) { + return false; + } +} + diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index dcecc07..b5d3dd2 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -143,6 +143,14 @@ protected: * */ const keyboard_state_t & get_keyboard_state() const; + /** + * \brief Utility function to retrieve a single key state. + * \see SDLContext::get_keyboard_state + * + * \return Keycode state (true if pressed, false if not pressed). + * + */ + bool get_key_state(Keycode key) const; //! \} private: -- cgit v1.2.3 From 3c99c73f3c1c31ba97f7e8c74f434c880f8a9036 Mon Sep 17 00:00:00 2001 From: WBoerenkamps <wrj.boerenkamps@student.avans.nl> Date: Sun, 15 Dec 2024 22:44:09 +0100 Subject: enter between functions --- src/crepe/api/Script.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp index 4cd59a5..d4eaae9 100644 --- a/src/crepe/api/Script.cpp +++ b/src/crepe/api/Script.cpp @@ -30,11 +30,11 @@ const keyboard_state_t & Script::get_keyboard_state() const { SDLContext & sdl_context = this->mediator->sdl_context; return sdl_context.get_keyboard_state(); } -bool Script::get_key_state(Keycode key) const{ + +bool Script::get_key_state(Keycode key) const { try { return this->get_keyboard_state().at(key); } catch (...) { return false; } } - -- cgit v1.2.3 From c96ef5f62a1369d66e8eba9bf8ed192e3cf8e716 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch <loek@pipeframe.xyz> Date: Tue, 17 Dec 2024 14:19:09 +0100 Subject: add noexcept qualifier to Script::get_key_state --- src/crepe/api/Script.cpp | 2 +- src/crepe/api/Script.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Script.cpp b/src/crepe/api/Script.cpp index d4eaae9..583c04f 100644 --- a/src/crepe/api/Script.cpp +++ b/src/crepe/api/Script.cpp @@ -31,7 +31,7 @@ const keyboard_state_t & Script::get_keyboard_state() const { return sdl_context.get_keyboard_state(); } -bool Script::get_key_state(Keycode key) const { +bool Script::get_key_state(Keycode key) const noexcept { try { return this->get_keyboard_state().at(key); } catch (...) { diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index b5d3dd2..65306cd 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -150,7 +150,7 @@ protected: * \return Keycode state (true if pressed, false if not pressed). * */ - bool get_key_state(Keycode key) const; + bool get_key_state(Keycode key) const noexcept; //! \} private: -- cgit v1.2.3 From 9232a98b72eee7af4f7f2153c1b2ccedbfa4cc65 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch <loek@pipeframe.xyz> Date: Tue, 17 Dec 2024 14:42:29 +0100 Subject: fix code standard --- src/crepe/facade/SDLContext.cpp | 5 ++--- src/crepe/facade/SDLContext.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 7ccc243..f331517 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -75,9 +75,8 @@ SDLContext::~SDLContext() { } Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { - if (!LOOKUP_TABLE.contains(sdl_key)) return Keycode::NONE; - - return LOOKUP_TABLE.at(sdl_key); + if (!lookup_table.contains(sdl_key)) return Keycode::NONE; + return lookup_table.at(sdl_key); } const keyboard_state_t & SDLContext::get_keyboard_state() { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 8f4760e..b9c7fbd 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -245,7 +245,7 @@ private: //! variable to store the state of each key (true = pressed, false = not pressed) keyboard_state_t keyboard_state; //! lookup table for converting SDL_SCANCODES to Keycodes - const std::unordered_map<SDL_Scancode, Keycode> LOOKUP_TABLE + const std::unordered_map<SDL_Scancode, Keycode> lookup_table = {{SDL_SCANCODE_SPACE, Keycode::SPACE}, {SDL_SCANCODE_APOSTROPHE, Keycode::APOSTROPHE}, {SDL_SCANCODE_COMMA, Keycode::COMMA}, -- cgit v1.2.3