Optimisations des collisions

This commit is contained in:
Mattéo Delabre 2016-04-15 15:14:19 +02:00
parent 3d620bfd11
commit 0af5789c00
5 changed files with 15 additions and 36 deletions

View File

@ -22,8 +22,6 @@ struct CollisionData {
std::shared_ptr<Object> obj_a; std::shared_ptr<Object> obj_a;
std::shared_ptr<Object> obj_b; std::shared_ptr<Object> obj_b;
CollisionData();
}; };
/** /**

View File

@ -101,12 +101,6 @@ public:
*/ */
virtual void updatePosition(); 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 * Résolution de la collision entre cet objet
* et l'objet passé en paramètre selon la normale * et l'objet passé en paramètre selon la normale

View File

@ -186,7 +186,6 @@ namespace {
} }
} }
CollisionData::CollisionData() {}
bool getCollisionData(CollisionData& data) { bool getCollisionData(CollisionData& data) {
CollisionType type_a = data.obj_a->getCollisionType(); CollisionType type_a = data.obj_a->getCollisionType();
CollisionType type_b = data.obj_b->getCollisionType(); CollisionType type_b = data.obj_b->getCollisionType();

View File

@ -191,7 +191,7 @@ void Game::update() {
// l'objet est sorti de la zone, on le signale et on // l'objet est sorti de la zone, on le signale et on
// planifie sa mort à la prochaine frame // 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); kill(obj_a);
// si c'était un joueur, on a perdu // si c'était un joueur, on a perdu
@ -205,12 +205,24 @@ void Game::update() {
// d'autres objets // d'autres objets
for (auto jt = it + 1; jt != objects.end(); jt++) { for (auto jt = it + 1; jt != objects.end(); jt++) {
Object::Ptr obj_b = *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_a = obj_a;
data.obj_b = obj_b; data.obj_b = obj_b;
if (obj_a->detectCollision(obj_b, data)) { if (getCollisionData(data)) {
colliding.push_back(data); colliding.push_back(data);
} }
} }

View File

@ -229,30 +229,6 @@ void Object::updatePosition() {
position += velocity * Manager::FRAME_TIME.asSeconds(); 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) { void Object::solveCollision(Game& game, Object::Ptr obj, const sf::Vector2f& normal) {
// si les deux objets sont de masse infinie, réinitialisation // si les deux objets sont de masse infinie, réinitialisation
// des vitesses en tant que collision // des vitesses en tant que collision