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