Witam,
Piszę grę w SFML i mam w niej kamienie reprezentowane przez CircleShape i postać gracza reprezentowaną przez RectangleShape. Kolizję sprawdzam taką funkcją (nie trzeba się z nią wnikliwie zapoznawać do zrozumienia problemu, wystarczy zauważyć że kolizja jest sprawdzana za pomocą FloatRect-ów postaci i kamieni):
bool rectCircleCollision(const sf::FloatRect rect, const sf::FloatRect circle)
{
if (rect.intersects(circle))
{
if (circle.left + circle.width / 2 > rect.left && circle.left + circle.width / 2 < rect.left + rect.width)
return true;
if (circle.top + circle.height / 2 > rect.top && circle.top + circle.height / 2 < rect.top + rect.height)
return true;
float deltaX, deltaY, Z;
if(circle.top + circle.height / 2 > rect.top + rect.height)
deltaY = circle.top + circle.height / 2 - (rect.top + rect.height);
else
deltaY = rect.top - (circle.top + circle.height / 2);
if (circle.left + circle.width / 2 < rect.left) // circle on the left of rectangle
deltaX = rect.left - (circle.left + circle.width / 2);
else // circle on the right of rectangle
deltaX = circle.left + circle.width / 2 - (rect.left + rect.width);
Z = static_cast <float> (sqrt(static_cast <double> (deltaX*deltaX + deltaY*deltaY)));
std::cout << "Z: " << Z << ", radious: " << circle.width/2 << "\n";
if (Z < circle.width/2) // circle.width / 2 as a radious of circle
return true;
}
return false;
}
Problem jest taki że kamienie mają promień 100 czyli szerokość i wysokość FloatRect zwracanego przez getGlobalBounds powinna mieć 100 i tak jest w przypadku kiedy kamienie nie są obrócone. Jednak kamienie obracają się aby uzyskać efekt animacji (obracam je za pomocą funkcji rotate() oczywiście). Tutaj pojawia się problem, gdy kamień jest obrócony o 45 lub 135 stopni wysokość i szerokość FloatRect ma 140 pixeli. Ta zmiana nie występuje nagle tylko stopniowo wraz ze zmianą kąta odchylenia.
Nie rozumiem czemu tak się dzieje. Jeżeli ktoś wie jak sobie z tym poradzić to bardzo proszę o pomoc.