diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/crepe/system/CollisionSystem.cpp | 15 | ||||
-rw-r--r-- | src/crepe/system/CollisionSystem.h | 5 | ||||
-rw-r--r-- | src/example/game.cpp | 143 |
3 files changed, 147 insertions, 16 deletions
diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 86eafc0..f75d0ad 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -159,7 +159,7 @@ CollisionSystem::collision_handler(CollisionInternal & data1, CollisionInternal vec2 collider_pos2 = this->get_current_position(collider2.offset, data2.transform, data2.rigidbody); resolution = this->get_circle_box_resolution(collider2, collider1, collider_pos2, - collider_pos1); + collider_pos1,true); break; } case CollisionInternalType::CIRCLE_CIRCLE: { @@ -185,7 +185,7 @@ CollisionSystem::collision_handler(CollisionInternal & data1, CollisionInternal vec2 collider_pos2 = this->get_current_position(collider2.offset, data2.transform, data2.rigidbody); resolution = this->get_circle_box_resolution(collider1, collider2, collider_pos1, - collider_pos2); + collider_pos2,false); break; } } @@ -261,9 +261,10 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider & circle // Normalize the delta vector to get the collision direction vec2 collision_normal = delta / distance; + // Compute the resolution vector - vec2 resolution = collision_normal * penetration_depth; + vec2 resolution = -collision_normal * penetration_depth; return resolution; } @@ -271,7 +272,7 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider & circle vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_collider, const BoxCollider & box_collider, const vec2 & circle_position, - const vec2 & box_position) const { + const vec2 & box_position,bool inverse) const { vec2 delta = circle_position - box_position; // Compute half-dimensions of the box @@ -293,7 +294,7 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; - + if(inverse) collision_normal = -collision_normal; // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; @@ -511,7 +512,7 @@ bool CollisionSystem::get_box_circle_collision(const BoxCollider & box1, float distance_squared = distance_x * distance_x + distance_y * distance_y; // Compare distance squared with the square of the circle's radius - return distance_squared <= circle2.radius * circle2.radius; + return distance_squared <= circle2.radius * circle2.radius-1; } bool CollisionSystem::get_circle_circle_collision(const CircleCollider & circle1, @@ -532,7 +533,7 @@ bool CollisionSystem::get_circle_circle_collision(const CircleCollider & circle1 float radius_sum = circle1.radius + circle2.radius; // Check if the distance between the centers is less than or equal to the sum of the radii - return distance_squared <= radius_sum * radius_sum; + return distance_squared <= radius_sum * radius_sum - 1; } vec2 CollisionSystem::get_current_position(const vec2 & collider_offset, diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 6995bb5..b978dbb 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -177,13 +177,14 @@ private: * \param circle_collider The first CircleCollider. * \param box_collider The second CircleCollider. * \param circle_position The position of the CircleCollider. - * \param box_position The position of the BocCollider. + * \param box_position The position of the BoxCollider. + * \param inverse Inverted true if box circle collision, false if circle box collision (inverts the direction). * \return The resolution vector for the collision. */ vec2 get_circle_box_resolution(const CircleCollider & circle_collider, const BoxCollider & box_collider, const vec2 & circle_position, - const vec2 & box_position) const; + const vec2 & box_position,bool inverse) const; /** * \brief Determines the appropriate collision handler for a collision. diff --git a/src/example/game.cpp b/src/example/game.cpp index ade90c9..be756bd 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -1,3 +1,4 @@ +#include "api/CircleCollider.h" #include "manager/ComponentManager.h" #include "api/Scene.h" #include "manager/Mediator.h" @@ -18,7 +19,8 @@ using namespace crepe; using namespace std; -class MyScript : public Script { +class MyScript1 : public Script { + bool flip = false; bool oncollision(const CollisionEvent & test) { Log::logf("Box {} script on_collision()", test.info.this_collider.game_object_id); return true; @@ -50,6 +52,98 @@ class MyScript : public Script { tf.position.x += 1; break; } + case Keycode::E: + { + if(flip){ + flip = false; + this->get_component<BoxCollider>().active = true; + this->get_components<Sprite>()[0].get().active = true; + this->get_component<CircleCollider>().active = false; + this->get_components<Sprite>()[1].get().active = false; + } + else { + flip = true; + this->get_component<BoxCollider>().active = false; + this->get_components<Sprite>()[0].get().active = false; + this->get_component<CircleCollider>().active = true; + this->get_components<Sprite>()[1].get().active = true; + } + + + //add collider switch + break; + } + default: + break; + } + return false; + } + + void init() { + Log::logf("init"); + subscribe<CollisionEvent>([this](const CollisionEvent & ev) -> bool { return this->oncollision(ev); }); + subscribe<KeyPressEvent>([this](const KeyPressEvent & ev) -> bool { return this->keypressed(ev); }); + } + void update() { + // Retrieve component from the same GameObject this script is on + } + +}; + +class MyScript2 : public Script { + bool flip = false; + bool oncollision(const CollisionEvent & test) { + Log::logf("Box {} script on_collision()", test.info.this_collider.game_object_id); + return true; + } + bool keypressed(const KeyPressEvent & test) { + Log::logf("Box script keypressed()"); + switch (test.key) { + case Keycode::LEFT: + { + Transform & tf = this->get_component<Transform>(); + tf.position.x -= 1; + break; + } + case Keycode::UP: + { + Transform & tf = this->get_component<Transform>(); + tf.position.y -= 1; + break; + } + case Keycode::DOWN: + { + Transform & tf = this->get_component<Transform>(); + tf.position.y += 1; + break; + } + case Keycode::RIGHT: + { + Transform & tf = this->get_component<Transform>(); + tf.position.x += 1; + break; + } + case Keycode::PAUSE: + { + if(flip){ + flip = false; + this->get_component<BoxCollider>().active = true; + this->get_components<Sprite>()[0].get().active = true; + this->get_component<CircleCollider>().active = false; + this->get_components<Sprite>()[1].get().active = false; + } + else { + flip = true; + this->get_component<BoxCollider>().active = false; + this->get_components<Sprite>()[0].get().active = false; + this->get_component<CircleCollider>().active = true; + this->get_components<Sprite>()[1].get().active = true; + } + + + //add collider switch + break; + } default: break; } @@ -77,8 +171,8 @@ public: ComponentManager & mgr = m.component_manager; Color color(0, 0, 0, 255); - float screen_size_width = 640; - float screen_size_height = 480; + float screen_size_width = 320; + float screen_size_height = 240; float world_collider = 1000; //define playable world GameObject world = mgr.new_object( @@ -101,7 +195,7 @@ public: 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<Camera>(Color::WHITE, ivec2{640, 480}, vec2{640, 480}, 1.0f); + world.add_component<Camera>(Color::WHITE, ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, vec2{screen_size_width, screen_size_height}, 1.0f); GameObject game_object1 = mgr.new_object( "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); @@ -115,11 +209,46 @@ public: .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<BehaviorScript>().set_script<MyScript>(); - auto img = Texture("asset/texture/green_square.png"); - game_object1.add_component<Sprite>(img, color, Sprite::FlipSettings{false, false}, 1, + game_object1.add_component<BehaviorScript>().set_script<MyScript1>(); + auto img1 = Texture("asset/texture/square.png"); + game_object1.add_component<Sprite>(img1, color, Sprite::FlipSettings{false, false}, 1, 1, 20); + + //add circle with cirlcecollider deactiveated + game_object1.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + auto img2 = Texture("asset/texture/circle.png"); + game_object1.add_component<Sprite>(img2, color, Sprite::FlipSettings{false, false}, 1, + 1, 20).active = false; + + + + GameObject game_object2 = mgr.new_object( + "Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1); + game_object2.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 0, + .body_type = Rigidbody::BodyType::STATIC, + .linear_velocity = {0, 0}, + .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<BehaviorScript>().set_script<MyScript2>(); + auto img3 = Texture("asset/texture/square.png"); + game_object2.add_component<Sprite>(img3, color, Sprite::FlipSettings{false, false}, 1, + 1, 20); + + //add circle with cirlcecollider deactiveated + game_object2.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; + auto img4 = Texture("asset/texture/circle.png"); + game_object2.add_component<Sprite>(img4, color, Sprite::FlipSettings{false, false}, 1, + 1, 20).active = false; + } string get_name() const { return "scene1"; } |