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) {
|
||||
// TODO: coder cette fonction
|
||||
return false;
|
||||
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;
|
||||
}
|
||||
|
||||
// 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