Optimisations des collisions
This commit is contained in:
parent
3d620bfd11
commit
0af5789c00
|
@ -22,8 +22,6 @@ struct CollisionData {
|
|||
|
||||
std::shared_ptr<Object> obj_a;
|
||||
std::shared_ptr<Object> obj_b;
|
||||
|
||||
CollisionData();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -101,12 +101,6 @@ public:
|
|||
*/
|
||||
virtual void updatePosition();
|
||||
|
||||
/**
|
||||
* Détecte s'il y a collision entre cet objet
|
||||
* et l'objet passé en paramètre
|
||||
*/
|
||||
virtual bool detectCollision(Object::Ptr obj, CollisionData& data) const;
|
||||
|
||||
/**
|
||||
* Résolution de la collision entre cet objet
|
||||
* et l'objet passé en paramètre selon la normale
|
||||
|
|
|
@ -186,7 +186,6 @@ namespace {
|
|||
}
|
||||
}
|
||||
|
||||
CollisionData::CollisionData() {}
|
||||
bool getCollisionData(CollisionData& data) {
|
||||
CollisionType type_a = data.obj_a->getCollisionType();
|
||||
CollisionType type_b = data.obj_b->getCollisionType();
|
||||
|
|
18
src/game.cpp
18
src/game.cpp
|
@ -191,7 +191,7 @@ void Game::update() {
|
|||
|
||||
// l'objet est sorti de la zone, on le signale et on
|
||||
// planifie sa mort à la prochaine frame
|
||||
if (!isInZone(obj_a) && obj_a->getMass() != 0) {
|
||||
if (obj_a->getMass() != 0 && !isInZone(obj_a)) {
|
||||
kill(obj_a);
|
||||
|
||||
// si c'était un joueur, on a perdu
|
||||
|
@ -205,12 +205,24 @@ void Game::update() {
|
|||
// d'autres objets
|
||||
for (auto jt = it + 1; jt != objects.end(); jt++) {
|
||||
Object::Ptr obj_b = *jt;
|
||||
CollisionData data;
|
||||
|
||||
// si les objets ne sont pas sur la même couche,
|
||||
// ils ne peuvent pas entrer en collision
|
||||
if (obj_a->getLayer() != obj_b->getLayer()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// si les deux boîtes englobantes des deux objets ne
|
||||
// s'intersectent pas, il ne risque pas d'y avoir de collision
|
||||
if (!obj_a->getAABB().intersects(obj_b->getAABB())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CollisionData data;
|
||||
data.obj_a = obj_a;
|
||||
data.obj_b = obj_b;
|
||||
|
||||
if (obj_a->detectCollision(obj_b, data)) {
|
||||
if (getCollisionData(data)) {
|
||||
colliding.push_back(data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -229,30 +229,6 @@ void Object::updatePosition() {
|
|||
position += velocity * Manager::FRAME_TIME.asSeconds();
|
||||
}
|
||||
|
||||
bool Object::detectCollision(Object::Ptr obj, CollisionData& data) const {
|
||||
// si les objets ne sont pas sur la même couche,
|
||||
// ils ne peuvent pas entrer en collision
|
||||
if (getLayer() != obj->getLayer()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// si on a affaire à deux objets de masse infinie et
|
||||
// de vitesse nulle, pas de collision
|
||||
if (getMassInvert() == 0 && obj->getMassInvert() == 0 &&
|
||||
getVelocity().x == 0 && getVelocity().y == 0 &&
|
||||
obj->getVelocity().x == 0 && obj->getVelocity().y == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// si les deux boîtes englobantes des deux objets ne
|
||||
// s'intersectent pas, il ne risque pas d'y avoir de collision
|
||||
if (!getAABB().intersects(obj->getAABB())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return getCollisionData(data);
|
||||
}
|
||||
|
||||
void Object::solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& normal) {
|
||||
// si les deux objets sont de masse infinie, réinitialisation
|
||||
// des vitesses en tant que collision
|
||||
|
|
Loading…
Reference in New Issue