diff --git a/include/collision.hpp b/include/collision.hpp index 50f2212..afa1bcd 100644 --- a/include/collision.hpp +++ b/include/collision.hpp @@ -22,8 +22,6 @@ struct CollisionData { std::shared_ptr obj_a; std::shared_ptr obj_b; - - CollisionData(); }; /** diff --git a/include/object.hpp b/include/object.hpp index 863501b..58edc62 100644 --- a/include/object.hpp +++ b/include/object.hpp @@ -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 diff --git a/src/collision.cpp b/src/collision.cpp index ac6f8ec..5d52872 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -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(); diff --git a/src/game.cpp b/src/game.cpp index 20a41d8..0101beb 100644 --- a/src/game.cpp +++ b/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); } } diff --git a/src/object.cpp b/src/object.cpp index f4f006f..553e5c3 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -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