From 349da67b2957d704c05036ab7bdef4b6cffd5e92 Mon Sep 17 00:00:00 2001 From: Bluub Date: Tue, 1 Jun 2021 17:21:26 +0200 Subject: [PATCH] runner with the collision system --- a | 12 ++++++++ sources/Runner/Runner.cpp | 31 +++++++++++++++----- sources/System/Collision/CollisionSystem.cpp | 16 +++++++--- sources/System/Collision/CollisionSystem.hpp | 3 ++ 4 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 a diff --git a/a b/a new file mode 100644 index 00000000..473008ac --- /dev/null +++ b/a @@ -0,0 +1,12 @@ +0 1 -- 2 3 +false || false +0 2 -- 1 3 +true +0 3 -- 1 2 +true +1 2 -- 0 3 +true +1 3 -- 0 2 +true +2 3 -- 0 1 +false \ No newline at end of file diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index 9e527fcb..2cdb2bc8 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -10,11 +10,14 @@ #include #include #include +#include #include #include #include #include +#include #include +#include #include #include #include @@ -43,6 +46,7 @@ namespace BBM wal.addSystem() .addSystem() .addSystem() + .addSystem(wal) .addSystem(); } @@ -52,6 +56,7 @@ namespace BBM RAY::Window &window = RAY::Window::getInstance(600, 400, "Bomberman", FLAG_WINDOW_RESIZABLE); wal.addSystem>(); + wal.addSystem>(); wal.addSystem(window) .addSystem>(); @@ -61,20 +66,30 @@ namespace BBM std::shared_ptr loadGameScene() { auto scene = std::make_shared(); - scene->addEntity("cube") - .addComponent() - .addComponent>(Vector2f(), Vector2f(10, 10), RED) - .addComponent() - .addComponent() - .addComponent();; + RAY3D::Cube cube(Vector3f(-5, 0, -5), Vector3f(3, 3, 3), RED); + RAY3D::Cube cubePlayer(Vector3f(0, 0, 0), Vector3f(3, 3, 3), GREEN); scene->addEntity("player") .addComponent() - .addComponent>("assets/player/player.iqm", std::make_pair(MAP_DIFFUSE, "assets/player/blue.png")) + .addComponent>(cubePlayer) .addComponent() .addComponent() + .addComponent(3) .addComponent(); + scene->addEntity("cube") + .addComponent(-5, 0, -5) + .addComponent>(cube) + .addComponent() + .addComponent() + .addComponent([](WAL::Entity &, const WAL::Entity &){}, + [](WAL::Entity &actual, const WAL::Entity &) { + try { + auto &mov = actual.getComponent(); + mov.resetVelocity(); + } catch (std::exception &e) { }; + }, 3); + scene->addEntity("camera") - .addComponent(0, 20, -5) + .addComponent(0, 20, -1) .addComponent(); return scene; } diff --git a/sources/System/Collision/CollisionSystem.cpp b/sources/System/Collision/CollisionSystem.cpp index d3063ebd..36616155 100644 --- a/sources/System/Collision/CollisionSystem.cpp +++ b/sources/System/Collision/CollisionSystem.cpp @@ -14,6 +14,16 @@ namespace BBM { } + + bool CollisionSystem::collide(Vector3f minA, Vector3f maxA, Vector3f minB, Vector3f maxB) + { + bool overlapX = (minA.x <= maxB.x && maxA.x >= minB.x) || (minB.x <= maxA.x && maxB.x >= minA.x); + bool overlapY = (minA.y <= maxB.y && maxA.y >= minB.y) || (minB.y <= maxA.y && maxB.y >= minA.y); + bool overlapZ = (minA.z <= maxB.z && maxA.z >= minB.z) || (minB.z <= maxA.z && maxB.z >= minA.z); + + return (overlapX && overlapY && overlapZ); + } + void CollisionSystem::onFixedUpdate(WAL::Entity &entity) { auto &posA = entity.getComponent(); @@ -29,13 +39,11 @@ namespace BBM if (!other.hasComponent(typeid(CollisionComponent)) || !other.hasComponent(typeid(PositionComponent))) continue; - auto colB = entity.getComponent(); + auto colB = other.getComponent(); auto posB = other.getComponent().position; Vector3f minB = Vector3f::min(posB, posB + colB.bound); Vector3f maxB = Vector3f::max(posB, posB + colB.bound); - if ((minA.x <= maxB.x && maxA.x >= minB.x) && - (minA.y <= maxB.y && maxA.y >= minB.y) && - (minA.z <= maxB.z && maxA.z >= minB.z)) { + if (collide(minA, maxA, minB, maxB)) { col.getOnCollide()(entity, other); colB.getOnCollided()(entity, other); } diff --git a/sources/System/Collision/CollisionSystem.hpp b/sources/System/Collision/CollisionSystem.hpp index 04f7fd95..c4c2de25 100644 --- a/sources/System/Collision/CollisionSystem.hpp +++ b/sources/System/Collision/CollisionSystem.hpp @@ -29,5 +29,8 @@ namespace BBM ~CollisionSystem() override = default; //! @brief A Collision system is assignable. CollisionSystem &operator=(const CollisionSystem &) = default; + + //! @brief check AABB collision + static bool collide(Vector3f minA, Vector3f maxA, Vector3f minB, Vector3f maxB); }; } \ No newline at end of file