From a80477f2e7f4c18adcc6441828d17582aad2598f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 9 Dec 2024 15:29:18 +0100 Subject: get_keyboard_state working --- src/example/button.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/example') 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 #include #include -#include using namespace crepe; using namespace std; -- cgit v1.2.3 From afd81007153f05c8f8b42bcf08a8cdf8ce13a98c Mon Sep 17 00:00:00 2001 From: JAROWMR 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/example') 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().update(); this->event_manager.dispatch_events(); this->get_system().update(); + this->get_system().update(); this->get_system().update(); this->get_system().update(); this->get_system().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 #include #include #include @@ -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(loop_timer.get_scaled_fixed_delta_time()).count(); + RefVector emitters = mgr.get_components_by_type(); - 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(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(img5, Sprite::Data{.size = {5, 5},}); + auto & test = particle.add_component(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::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 512aa7f54b88994d3095971b2001930b4e612947 Mon Sep 17 00:00:00 2001 From: JAROWMR 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/example') 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 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(img5, Sprite::Data{.size = {5, 5},}); - auto & test = particle.add_component(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(img5, Sprite::Data{ + .size = {5, 5}, + }); + auto & test + = particle.add_component(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 -#include #include #include #include @@ -8,18 +6,18 @@ #include #include #include +#include +#include #define protected public #define private public #include #include #include - 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(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(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(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 e30057abadb5372d84230fa4ce4238528177a9bf Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 14 Dec 2024 11:53:40 +0100 Subject: fixed game example --- src/example/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/example') diff --git a/src/example/game.cpp b/src/example/game.cpp index f8520f4..7c9a227 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -262,7 +262,7 @@ public: = false; Asset img5{"asset/texture/square.png"}; - GameObject particle = mgr.new_object( + GameObject particle = new_object( "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); auto & particle_image = particle.add_component(img5, Sprite::Data{ .size = {5, 5}, -- cgit v1.2.3 From 1a5116b944bcbdeeb3474faefbe150e82f8697b1 Mon Sep 17 00:00:00 2001 From: JAROWMR 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/example') 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 collision_layers; + std::set 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( - vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}, - vec2{world_collider, world_collider}); - ; // Top - world.add_component(vec2{0, screen_size_height / 2 + world_collider / 2}, - vec2{world_collider, world_collider}); // Bottom - world.add_component( - vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}, - vec2{world_collider, world_collider}); // Left - world.add_component(vec2{screen_size_width / 2 + world_collider / 2, 0}, - vec2{world_collider, world_collider}); // right + world.add_component(vec2{world_collider, world_collider},vec2{0, 0 - (screen_size_height / 2 + world_collider / 2)}); // Top + world.add_component(vec2{world_collider, world_collider},vec2{0, screen_size_height / 2 + world_collider / 2}); // Bottom + world.add_component(vec2{world_collider, world_collider},vec2{0 - (screen_size_width / 2 + world_collider / 2), 0}); // Left + world.add_component(vec2{world_collider, world_collider},vec2{screen_size_width / 2 + world_collider / 2, 0}); // right world.add_component( ivec2{static_cast(screen_size_width), static_cast(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(vec2{0, 0}, vec2{20, 20}); + game_object1.add_component(vec2{20, 20}); game_object1.add_component().set_script(); Asset img1{"asset/texture/square.png"}; @@ -219,7 +210,7 @@ public: }); //add circle with cirlcecollider deactiveated - game_object1.add_component(vec2{0, 0}, 10).active = false; + game_object1.add_component(10).active = false; Asset img2{"asset/texture/circle.png"}; game_object1 .add_component(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(vec2{0, 0}, vec2{20, 20}); + game_object2.add_component(vec2{20, 20}); game_object2.add_component().set_script(); game_object2.add_component(img1, Sprite::Data{ @@ -250,7 +240,7 @@ public: }); //add circle with cirlcecollider deactiveated - game_object2.add_component(vec2{0, 0}, 10).active = false; + game_object2.add_component(10).active = false; game_object2 .add_component(img2, -- cgit v1.2.3 From dd89b381c212aa55a4e9d7bc7eea014e992956ef Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 14 Dec 2024 13:29:52 +0100 Subject: used add force in game.cpp --- src/example/game.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/example') diff --git a/src/example/game.cpp b/src/example/game.cpp index 60c9088..d03d78d 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -35,7 +35,8 @@ class MyScript1 : public Script { } case Keycode::W: { Rigidbody & tf = this->get_component(); - tf.data.linear_velocity.y -= 1; + // tf.data.linear_velocity.y -= 1; + tf.add_force_linear({0,-1}); break; } case Keycode::S: { @@ -197,7 +198,7 @@ public: .body_type = Rigidbody::BodyType::DYNAMIC, .linear_velocity = {0, 1}, .constraints = {0, 0, 0}, - .elastisity_coefficient = 1, + .elastisity_coefficient = 0, .offset = {0, 0}, }); // add box with boxcollider -- cgit v1.2.3 From c17233b10bd8e35bead60c5f44bb8a14836d755f Mon Sep 17 00:00:00 2001 From: WBoerenkamps 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/example') 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 -#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 #include #include -#include #include #include #include @@ -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(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 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 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 #include #include -#include +#include #include #include #include #include -#include +#include #include #include #include #include #include +#include #include #include #include @@ -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(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(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( - s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100); - std::function on_click = [&]() { std::cout << "button clicked" << std::endl; }; - std::function on_enter = [&]() { std::cout << "enter" << std::endl; }; - std::function on_exit = [&]() { std::cout << "exit" << std::endl; }; - auto & button - = button_obj.add_component