mirror of
https://github.com/zoriya/Bomberman.git
synced 2026-05-31 01:25:21 +00:00
Fixing bonus collisions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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();
|
||||
})
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user