diff --git a/sources/Component/Collision/CollisionComponent.cpp b/sources/Component/Collision/CollisionComponent.cpp index 652e6727..759e6d21 100644 --- a/sources/Component/Collision/CollisionComponent.cpp +++ b/sources/Component/Collision/CollisionComponent.cpp @@ -54,4 +54,20 @@ namespace BBM bound({boundSize, boundSize, boundSize}), positionOffset({positionOffset, positionOffset, positionOffset}) {} + + CollisionComponent::CollidedAxis operator|(CollisionComponent::CollidedAxis first, + CollisionComponent::CollidedAxis second) + { + return static_cast(static_cast(first) | static_cast(second)); + } + + CollisionComponent::CollidedAxis &operator|=(CollisionComponent::CollidedAxis &self, + CollisionComponent::CollidedAxis other) + { + int &selfI = reinterpret_cast(self); + int otherI = static_cast(other); + + selfI |= otherI; + return reinterpret_cast(selfI); + } } \ No newline at end of file diff --git a/sources/Component/Collision/CollisionComponent.hpp b/sources/Component/Collision/CollisionComponent.hpp index 0190a56a..e50b4ead 100644 --- a/sources/Component/Collision/CollisionComponent.hpp +++ b/sources/Component/Collision/CollisionComponent.hpp @@ -17,6 +17,7 @@ namespace BBM //! @brief Used to tell the collided axis //! @note Usage: (collidedAxis (int given by callback)) & CollidedAxis::X enum CollidedAxis { + NONE = 0, X = 1, Y = 2, Z = 4, @@ -73,4 +74,7 @@ namespace BBM //! @brief A component can't be assigned CollisionComponent &operator=(const CollisionComponent &) = delete; }; + + CollisionComponent::CollidedAxis operator|(CollisionComponent::CollidedAxis first, CollisionComponent::CollidedAxis second); + CollisionComponent::CollidedAxis &operator|=(CollisionComponent::CollidedAxis &self, CollisionComponent::CollidedAxis other); } \ No newline at end of file diff --git a/sources/Items/Bonus.cpp b/sources/Items/Bonus.cpp index 17266a5f..e22aa658 100644 --- a/sources/Items/Bonus.cpp +++ b/sources/Items/Bonus.cpp @@ -20,6 +20,7 @@ namespace BBM { if (!bombHolder) return; bombHolder->maxBombCount++; + const_cast(bonus).scheduleDeletion(); } void Bonus::ExplosionRangeBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) @@ -31,6 +32,7 @@ namespace BBM { if (!bombHolder || !playerBonus) return; bombHolder->explosionRadius++; + const_cast(bonus).scheduleDeletion(); } void Bonus::SpeedUpBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) @@ -42,6 +44,7 @@ namespace BBM { if (!controllable || !playerBonus) return; controllable->speed += 0.025f; + const_cast(bonus).scheduleDeletion(); } void Bonus::NoClipBonus(WAL::Entity &player, const WAL::Entity &bonus, CollisionComponent::CollidedAxis axis) @@ -53,6 +56,7 @@ namespace BBM { return; playerBonus->nextNoClipRate = playerBonus->noClipBonusRate; playerBonus->isNoClipOn = true; + const_cast(bonus).scheduleDeletion(); } Bonus::BonusType Bonus::getRandomBonusType() diff --git a/sources/Map/Map.cpp b/sources/Map/Map.cpp index aa59f470..02579a06 100644 --- a/sources/Map/Map.cpp +++ b/sources/Map/Map.cpp @@ -99,9 +99,8 @@ namespace BBM entity.scheduleDeletion(); }) .addComponent(position.y) - .addComponent([](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) { - bonus.scheduleDeletion(); - }, func[bonusType - 1], 0.5, .5) + .addComponent(WAL::Callback(), + func[bonusType - 1], 0.5, .5) .addComponent(5s, [](WAL::Entity &bonus, WAL::Wal &wal){ bonus.scheduleDeletion(); }) diff --git a/sources/System/Collision/CollisionSystem.cpp b/sources/System/Collision/CollisionSystem.cpp index f2604254..abdfdf6d 100644 --- a/sources/System/Collision/CollisionSystem.cpp +++ b/sources/System/Collision/CollisionSystem.cpp @@ -64,25 +64,25 @@ namespace BBM continue; auto pointB = posB.position + colB.positionOffset; - int collidedAxis = 0; + CollisionComponent::CollidedAxis collidedAxis = CollisionComponent::NONE; // TODO if B is also a movable we don't check with it's changing position Vector3f minB = Vector3f::min(pointB, pointB + colB.bound); Vector3f maxB = Vector3f::max(pointB, pointB + colB.bound); if (boxesCollide(minAx, maxAx, minB, maxB)) { - collidedAxis += vel.isNull() ? 7 : CollisionComponent::CollidedAxis::X; + collidedAxis |= vel.isNull() ? CollisionComponent::ALL : CollisionComponent::X; } if (!vel.isNull()) { if (boxesCollide(minAy, maxAy, minB, maxB)) { - collidedAxis += CollisionComponent::CollidedAxis::Y; + collidedAxis |= CollisionComponent::Y; } if (boxesCollide(minAz, maxAz, minB, maxB)) { - collidedAxis += CollisionComponent::CollidedAxis::Z; + collidedAxis |= CollisionComponent::Z; } } if (collidedAxis) { - colA.onCollide(entity, other, static_cast(collidedAxis)); - colB.onCollided(entity, other, static_cast(collidedAxis)); + colA.onCollide(entity, other, collidedAxis); + colB.onCollided(entity, other, collidedAxis); } } }