Fixing bonus collisions

This commit is contained in:
Zoe Roux
2021-06-17 14:37:34 +02:00
parent fcb1c91044
commit e9c3f8e083
5 changed files with 32 additions and 9 deletions
@@ -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<CollisionComponent::CollidedAxis>(static_cast<int>(first) | static_cast<int>(second));
}
CollisionComponent::CollidedAxis &operator|=(CollisionComponent::CollidedAxis &self,
CollisionComponent::CollidedAxis other)
{
int &selfI = reinterpret_cast<int &>(self);
int otherI = static_cast<int>(other);
selfI |= otherI;
return reinterpret_cast<CollisionComponent::CollidedAxis &>(selfI);
}
}
@@ -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);
}
+4
View File
@@ -20,6 +20,7 @@ namespace BBM {
if (!bombHolder)
return;
bombHolder->maxBombCount++;
const_cast<WAL::Entity &>(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<WAL::Entity &>(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<WAL::Entity &>(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<WAL::Entity &>(bonus).scheduleDeletion();
}
Bonus::BonusType Bonus::getRandomBonusType()
+2 -3
View File
@@ -99,9 +99,8 @@ namespace BBM
entity.scheduleDeletion();
})
.addComponent<LevitateComponent>(position.y)
.addComponent<CollisionComponent>([](WAL::Entity &bonus, const WAL::Entity &player, CollisionComponent::CollidedAxis axis) {
bonus.scheduleDeletion();
}, func[bonusType - 1], 0.5, .5)
.addComponent<CollisionComponent>(WAL::Callback<WAL::Entity &, const WAL::Entity &, CollisionComponent::CollidedAxis>(),
func[bonusType - 1], 0.5, .5)
.addComponent<TimerComponent>(5s, [](WAL::Entity &bonus, WAL::Wal &wal){
bonus.scheduleDeletion();
})
+6 -6
View File
@@ -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<CollisionComponent::CollidedAxis>(collidedAxis));
colB.onCollided(entity, other, static_cast<CollisionComponent::CollidedAxis>(collidedAxis));
colA.onCollide(entity, other, collidedAxis);
colB.onCollided(entity, other, collidedAxis);
}
}
}