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

SFML - Niepoprawnie działająca instrukcja warunkowa z FloatRect podczas sprawdzania kolizji.

42 Warsaw Coding Academy
0 głosów
595 wizyt
pytanie zadane 25 lutego 2016 w C i C++ przez milosz503 Początkujący (270 p.)
edycja 25 lutego 2016 przez milosz503

Dlaczego instrukcja warunkowa nie działa tak jak powinna?

Próbuję zrobić grę - prostą platformówkę, napotkałem jednak problem z niepoprawnie działającą(?) instrukcją warunkową, podczas sprawdzania kolizji z wykorzystanie FloatRect. 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...

Kawałek kodu:

bool Physics::intersects(FloatRect& rect1, FloatRect& rect2)
{
	std::cout << "Intersects:" << std::endl;
	std::cout << "___________________________________" << 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 << "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 << "-----------------------------------" << std::endl;
		return true;
	}
	else
	{
		return false;
	}

}

Przykładowe wyjścia:

Intersects:
___________________________________
inter true:
Player: 490.018 500 100 100
Blok: 550 400 100 100
-----------------------------------

lub

Intersects:
___________________________________
inter true:
Player: 480.014 500 100 100
Blok: 550 400 100 100
-----------------------------------

 

Wydaje się niemożliwe aby wykonała się instrukcja, ale być może popełniłem jakiś głupi błąd logiczny.

 

UPDATE

Zobrazowanie problemu:

2 odpowiedzi

0 głosów
odpowiedź 25 lutego 2016 przez maly Nałogowiec (37,190 p.)

Czemu nie użyjesz metody sf::Rect::intersects?

komentarz 25 lutego 2016 przez milosz503 Początkujący (270 p.)
Dziękuję za odpowiedź, jednak to jest uniknięcie problemu, a ja dalej nie wiem, czemu to nie dziala?... ;), Do tego wiem co moja funkcja robi(w teorii), a jakiś czas temu używałem gotowej i z jakiegoś powodu mi nie odpowiadał(chyba wykrywała kolizję na zasadzie np. >=, a nie >).
komentarz 25 lutego 2016 przez milosz503 Początkujący (270 p.)
Przetestowałem używając sf::Rect::intersects i problem nadal występuje, mam gracza przechodzącego bezpośrednio pod obiektem i czasem wykrywa kolizje a czasem nie. Wyżej podane wejścia próbowałem testować tworząc takie same obiekty FloaRect i sprawdzać za pomocą mojej funkcji i tej od SFML ale nie wykrywa kolizji... Wykrywa ją tylko podczas trwania gry...
0 głosów
odpowiedź 25 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Przecież twój kod sprawdza jedynie zawarcie się jednego prostokąta w drugim, czyli tylko pewien przypadek kolizji.
komentarz 25 lutego 2016 przez milosz503 Początkujący (270 p.)
A jakie są inne przypadki kolizji? To jest tylko kawałek kodu, a problem polega na tym, że trzecia część if'a w teorii w żadnym z podanych przeze mnie wyjść nie jest prawdziwa.

rect1.top < (rect2.top + rect2.height)

Czyli: 500 < (400 + 100)  - powinno dawać false, czyli nie jest spełniony cały warunek, ale i tak się wykonuje...
komentarz 25 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

Przepraszam, po wnikliwym przebadaniu warunków mogę stwierdzić, że działają one poprawnie. A dlaczego to ci nie działa, to nie wiem...

Metoda intersects sprawdza pozycje opierając się tylko na warunkach < oraz >, nie <=, czy >=.

komentarz 25 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

W podanym przez ciebie przykładzie podałeś źle współrzędne left.

komentarz 25 lutego 2016 przez milosz503 Początkujący (270 p.)
Poprawione, a z intersects z SFML, też testowałem i także czasem pojawia się błąd, więc nie rozwiązuje mojego problemu.

Podobne pytania

0 głosów
3 odpowiedzi 761 wizyt
0 głosów
2 odpowiedzi 486 wizyt
pytanie zadane 25 czerwca 2022 w C i C++ przez polandonion Dyskutant (7,630 p.)
0 głosów
0 odpowiedzi 420 wizyt

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,727 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
...