1
Général / Re : Problème de collisions
« le: Août 28, 2016, 03:02:24 pm »
Ok, désolé pour la réponse plutôt lente, mais j'ai finalement trouvé la source du problème
Voilà la fonction corrigée:
avec
Voilà la fonction corrigée:
//this will check if any point of second is inside first
bool shapesCollideCustom(const sf::ConvexShape & first, const sf::ConvexShape & second)
{
for (std::size_t i = 0; i < first.getPointCount(); i++)
{
//Point A = tab[i];
sf::Vector2f B;
if (i == first.getPointCount() - 1) // si c'est le dernier point, on relie au premier
B = first.getTransform().transformPoint(first.getPoint(0));
else // sinon on relie au suivant.
B = first.getTransform().transformPoint(first.getPoint(i + 1));
const sf::Vector2f A(first.getTransform().transformPoint(first.getPoint(i)));
//vector D = vector AB
const sf::Vector2f D(getVectorTwoPoints(A, B));
for (std::size_t j = 0; j < second.getPointCount(); j++)
{
const sf::Vector2f T(getVectorTwoPoints(A, second.getTransform().transformPoint(second.getPoint(j))));
if (D.x*T.y - D.y*T.x < 0)
{
if (j == second.getPointCount() - 1)
return false;
}
else
{
j = second.getPointCount();
}
}
}
return true;
}
bool shapesCollideCustom(const sf::ConvexShape & first, const sf::ConvexShape & second)
{
for (std::size_t i = 0; i < first.getPointCount(); i++)
{
//Point A = tab[i];
sf::Vector2f B;
if (i == first.getPointCount() - 1) // si c'est le dernier point, on relie au premier
B = first.getTransform().transformPoint(first.getPoint(0));
else // sinon on relie au suivant.
B = first.getTransform().transformPoint(first.getPoint(i + 1));
const sf::Vector2f A(first.getTransform().transformPoint(first.getPoint(i)));
//vector D = vector AB
const sf::Vector2f D(getVectorTwoPoints(A, B));
for (std::size_t j = 0; j < second.getPointCount(); j++)
{
const sf::Vector2f T(getVectorTwoPoints(A, second.getTransform().transformPoint(second.getPoint(j))));
if (D.x*T.y - D.y*T.x < 0)
{
if (j == second.getPointCount() - 1)
return false;
}
else
{
j = second.getPointCount();
}
}
}
return true;
}
avec
sf::Vector2f inline getVectorTwoPoints(const sf::Vector2f& A, const sf::Vector2f& B)
{
return sf::Vector2f(B.x - A.x, B.y - A.y);
}
{
return sf::Vector2f(B.x - A.x, B.y - A.y);
}