Ajout de la collision bloc à bloc
This commit is contained in:
parent
dad579a3fa
commit
098c5b1891
|
@ -54,6 +54,38 @@ bool Block::getCollisionInfo(Ball& obj, sf::Vector2f& normal, float& depth) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Block::getCollisionInfo(Block& obj, sf::Vector2f& normal, float& depth) {
|
bool Block::getCollisionInfo(Block& obj, sf::Vector2f& normal, float& depth) {
|
||||||
// TODO: coder cette fonction
|
std::unique_ptr<sf::FloatRect> aabb = getAABB();
|
||||||
|
std::unique_ptr<sf::FloatRect> obj_aabb = obj.getAABB();
|
||||||
|
sf::Vector2f relpos = getPosition() - obj.getPosition();
|
||||||
|
|
||||||
|
float overlap_x = aabb->width / 2 + obj_aabb->width / 2 - std::abs(relpos.x);
|
||||||
|
float overlap_y = aabb->height / 2 + obj_aabb->height / 2 - std::abs(relpos.y);
|
||||||
|
|
||||||
|
// si il n'y a pas de chauvauchement sur l'axe X et Y, pas de collision
|
||||||
|
if (overlap_x <= 0 || overlap_y <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// on choisit l'axe de pénétration maximale pour calculer la normale
|
||||||
|
if (overlap_x < overlap_y) {
|
||||||
|
if (relpos.x < 0) {
|
||||||
|
normal.x = -1;
|
||||||
|
} else {
|
||||||
|
normal.x = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
normal.y = 0;
|
||||||
|
depth = overlap_x;
|
||||||
|
} else {
|
||||||
|
if (relpos.y < 0) {
|
||||||
|
normal.y = -1;
|
||||||
|
} else {
|
||||||
|
normal.y = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
normal.x = 0;
|
||||||
|
depth = overlap_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue