• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - CircleShape getGlobalBounds()

0 głosów
255 wizyt
pytanie zadane 28 listopada 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)

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.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

–1 głos
2 odpowiedzi 547 wizyt
pytanie zadane 15 września 2017 w C i C++ przez Artur Koniec Gaduła (3,680 p.)
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)
0 głosów
1 odpowiedź 673 wizyt
pytanie zadane 13 października 2016 w C i C++ przez 10kw10 Pasjonat (22,880 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...