Suppression des valeurs magiques et évite la division par 0
This commit is contained in:
parent
02249f7150
commit
ecc6a3d006
|
@ -9,7 +9,7 @@
|
|||
class Ball : public Object {
|
||||
private:
|
||||
sf::Texture texture;
|
||||
sf::CircleShape shape;
|
||||
sf::RectangleShape shape;
|
||||
|
||||
protected:
|
||||
/**
|
||||
|
@ -37,6 +37,11 @@ public:
|
|||
virtual bool getCollisionInfo(Object& obj, sf::Vector2f& normal, float& depth);
|
||||
virtual bool getCollisionInfo(Ball& obj, sf::Vector2f& normal, float& depth);
|
||||
virtual bool getCollisionInfo(Block& obj, sf::Vector2f& normal, float& depth);
|
||||
|
||||
/**
|
||||
* Renvoie le rayon de la balle
|
||||
*/
|
||||
float getRadius();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
41
src/ball.cpp
41
src/ball.cpp
|
@ -4,8 +4,9 @@
|
|||
#include <array>
|
||||
#include <iostream>
|
||||
|
||||
Ball::Ball(float x, float y) : Object(x, y), shape(10) {
|
||||
shape.setOrigin(sf::Vector2f(10, 10));
|
||||
Ball::Ball(float x, float y) : Object(x, y),
|
||||
shape(sf::Vector2f(2 * getRadius(), 2 * getRadius())) {
|
||||
shape.setOrigin(sf::Vector2f(getRadius(), getRadius()));
|
||||
}
|
||||
|
||||
sf::Vector2f Ball::getForces(EngineState& state) {
|
||||
|
@ -26,10 +27,10 @@ sf::Vector2f Ball::getForces(EngineState& state) {
|
|||
void Ball::draw(sf::RenderWindow& window) {
|
||||
Object::draw(window);
|
||||
|
||||
// chargement de la texture de test
|
||||
if (!texture.loadFromFile("./res/ball.png")) {
|
||||
// chargement de la texture de test
|
||||
if (!texture.loadFromFile("./res/ball.png")) {
|
||||
// erreur
|
||||
}
|
||||
}
|
||||
|
||||
shape.rotate(getVelocity().x * .1f);
|
||||
shape.setTexture(&texture);
|
||||
|
@ -39,9 +40,9 @@ void Ball::draw(sf::RenderWindow& window) {
|
|||
|
||||
std::unique_ptr<sf::FloatRect> Ball::getAABB() {
|
||||
return std::unique_ptr<sf::FloatRect>(new sf::FloatRect(
|
||||
getPosition().x - 10,
|
||||
getPosition().y - 10,
|
||||
20, 20
|
||||
getPosition().x - getRadius(),
|
||||
getPosition().y - getRadius(),
|
||||
2 * getRadius(), 2 * getRadius()
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -52,11 +53,11 @@ bool Ball::getCollisionInfo(Object& obj, sf::Vector2f& normal, float& depth) {
|
|||
bool Ball::getCollisionInfo(Ball& obj, sf::Vector2f& normal, float& depth) {
|
||||
sf::Vector2f dir = getPosition() - obj.getPosition();
|
||||
float squaredLength = dir.x * dir.x + dir.y * dir.y;
|
||||
float totalRadius = getRadius() + obj.getRadius();
|
||||
|
||||
// TODO: supprimer les valeurs magiques
|
||||
// si les deux balles sont à une distance supérieure
|
||||
// à la somme de leurs deux rayons, il n'y a pas eu collision
|
||||
if (squaredLength > 20 * 20) {
|
||||
if (squaredLength > totalRadius * totalRadius) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -65,16 +66,14 @@ bool Ball::getCollisionInfo(Ball& obj, sf::Vector2f& normal, float& depth) {
|
|||
// les balles sont sur la même position.
|
||||
// Renvoie une normale apte à séparer les deux balles
|
||||
if (length == 0) {
|
||||
// TODO: supprimer les valeurs magiques
|
||||
depth = 20;
|
||||
depth = totalRadius;
|
||||
normal.x = 0;
|
||||
normal.y = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: supprimer les valeurs magiques
|
||||
// il y a eu collision
|
||||
depth = 20 - length;
|
||||
depth = totalRadius - length;
|
||||
normal = dir / length;
|
||||
return true;
|
||||
}
|
||||
|
@ -134,17 +133,19 @@ bool Ball::getCollisionInfo(Block& obj, sf::Vector2f& normal, float& depth) {
|
|||
sf::Vector2f prenormal = relpos - closest;
|
||||
float squaredLength = prenormal.x * prenormal.x + prenormal.y * prenormal.y;
|
||||
|
||||
// TODO: supprimer les valeurs magiques
|
||||
// si la balle est à l'extérieur et que
|
||||
// la normale est plus longue que son rayon,
|
||||
// il n'y a pas collision
|
||||
if (!isInside && squaredLength >= 10 * 10) {
|
||||
if (!isInside && squaredLength >= getRadius() * getRadius()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
float length = std::sqrt(squaredLength);
|
||||
depth = 10 - length;
|
||||
normal = prenormal / length;
|
||||
depth = getRadius() - length;
|
||||
|
||||
if (length != 0) {
|
||||
normal = prenormal / length;
|
||||
}
|
||||
|
||||
if (isInside) {
|
||||
normal *= -1.f;
|
||||
|
@ -152,3 +153,7 @@ bool Ball::getCollisionInfo(Block& obj, sf::Vector2f& normal, float& depth) {
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
float Ball::getRadius() {
|
||||
return 10 * getMass();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue