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_a;
|
||||||
std::shared_ptr<Object> obj_b;
|
std::shared_ptr<Object> obj_b;
|
||||||
|
|
||||||
CollisionData();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
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
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue