Dlaczego instrukcja warunkowa z wykorzystaniem float nie działa tak jak powinna?
Próbuję zrobić grę - prostą platformówkę z wykorzystaniem biblioteki SFML, napotkałem jednak problem z niepoprawnie działającą(?) instrukcją warunkową, podczas sprawdzania kolizji z wykorzystanie FloatRect[link]. Całkowicie nie wiem o co chodzi, ale według moich skromnych obliczeń if wykonuje się, kiedy w teorii nie są spełnione wszystkie warunki, co dziwne nie dzieje się tak za każdym razem, ale jakby losowo...
Metoda, w której występuje błąd:
bool Physics::intersects(FloatRect& rect1, FloatRect& rect2)
{
std::cout << "Intersects:" << std::endl;
std::cout << "___________________________________" << std::endl;
std::cout << "Player: " << rect1.left << " " << rect1.top << " " << rect1.width << " " << rect1.height << std::endl;
std::cout << "Blok: " << rect2.left << " " << rect2.top << " " << rect2.width << " " << rect2.height << std::endl;
std::cout << "Warunki" << std::endl;
std::cout << (rect1.left < (rect2.left + rect2.width)) << std::endl;
std::cout << ((rect1.left + rect1.width) > rect2.left) << std::endl;
std::cout << (rect1.top < (rect2.top + rect2.height)) << std::endl;
std::cout << ((rect1.top + rect1.height) > rect2.top) << std::endl;
if( (rect1.left < (rect2.left + rect2.width)) &&
((rect1.left + rect1.width) > rect2.left) &&
(rect1.top < (rect2.top + rect2.height)) &&
((rect1.top + rect1.height) > rect2.top)
)
{
std::cout << "inter true" << std::endl;
std::cout << "-----------------------------------" << std::endl;
return true;
}
else
{
return false;
}
}
Wyjście:
Intersects:
___________________________________
Player: 391.561 500 100 100
Blok: 400 400 100 100
Warunki
1
1
1
1
inter true:
Błąd występuje w trzecim warunku: (rect1.top < (rect2.top + rect2.height))
Gdzie: rect1.top = 500, rect2.top = 400, rect2.height = 100
Warunek zwraca true, mimo, że 500 < (400 + 100) powinno chyba zwrócić false?...
Czy jest możliwość, że porównywanie dwóch float'ów, które pokazują tą samą wartość może nie wyjść prawidłowo? Przed porównaniem są wykonywane różne działania, typu dodawanie małych wartości(następny ruch, grawitacja) .
Próbowałem używać metody intersects, niestety także wykrywała czasem kolizje, kiedy jej nie było.
Nad tym problemem męczę się już od długiego czasu i ciągle całkowicie nie wiem o co chodzi. Za każdą próbę pomocy będę niesamowicie wdzięczny.