arczi14 Temat założony przez niniejszego użytkownika |
SFML 2.0 Kolizje Prostokąt - koło » 2014-06-26 16:37:57 Witam, Jestem w trakcie pisania gry w SFML i muszę napiasć funkcję która zwraca prawdę gdy dojdzie do kolizji z j.w. Długo się z tym męczyłem i wkońcu popatrzyłem do internetu za radą. Znalazłem taki kod:
bool intersects( CircleType circle, RectType rect ) { circleDistance.x = abs( circle.x - rect.x ); circleDistance.y = abs( circle.y - rect.y ); if( circleDistance.x >( rect.width / 2 + circle.r ) ) { return false; } if( circleDistance.y >( rect.height / 2 + circle.r ) ) { return false; } if( circleDistance.x <=( rect.width / 2 ) ) { return true; } if( circleDistance.y <=( rect.height / 2 ) ) { return true; } cornerDistance_sq =( circleDistance.x - rect.width / 2 ) ^ 2 + ( circleDistance.y - rect.height / 2 ) ^ 2; return( cornerDistance_sq <=( circle.r ^ 2 ) ); }
Po przerobieniu do SFML wygląda u mnie tak: bool Player::collision( sf::Vector2f a, sf::Vector2f bP, sf::Vector2f b, float c ) { sf::Vector2f circleDistance; circleDistance.x = abs( a.x - bP.x ); circleDistance.y = abs( a.y - bP.y ); if( circleDistance.x >( b.x / 2 + c ) ) { return false; } if( circleDistance.y >( b.y / 2 + c ) ) { return false; } if( circleDistance.x <=( b.x / 2 ) ) { return true; } if( circleDistance.y <=( b.y / 2 ) ) { return true; } float cornerDistance_sq =( circleDistance.x - b.x / 2 ) *( circleDistance.x - b.x / 2 ) + ( circleDistance.y - b.y / 2 ) *( circleDistance.y - b.y / 2 ); return( cornerDistance_sq <=( c * c ) ); }
(Gdzie a to pozycja koła, b to rozmiar prostokąta, Bp to pozycja prostokąta, c promień ) Kod podany wyżej nie działa. Czy coś zrobiłem źle ? Czy ten kod powyżej po prostu nie działa. Pozdrawiam! |
|
pekfos |
» 2014-06-26 20:02:24 Kod podany wyżej nie działa. |
Czyli..? Czyli..? Środka? Rogu? |
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-26 20:18:51
Kod podany wyżej nie działa.
| Czyli..?
|
Czyli chciałbym aby bardziej doświadczeniu użytkownicy tego forum wypowiedzieli się na temat tego czy ten program ( a raczej funkcja ) znaleziony w sieci(podany w poście), dokładnie dzięki wyszukiwarce google, wygląda na taki który ma prawo działa, czyli wykrywa kolizje pomiędzy kołem a prostokątem choć sama nazwa tematu sugeruje, że oto chodzi .
Kod podany wyżej nie działa.
| Czyli..? Środka? Rogu?
|
Mówiąc dokładniej jest to pozycja jaką aktualnie prostokąt zajmuje na ekranie o rozdzielczości 1280x720 to chyba jasne... ;p |
|
pekfos |
» 2014-06-26 20:22:28 Bierz się za politykę. Tyle wody nalać i tak nie odpowiedzieć na pytania..? Nie działa, czyli co? Jest niedokładny, nie łapie w ogóle, czy może coś jeszcze innego..? Jaką pozycję prostokąta podajesz? Pozycję środka prostokąta, rogu prostokąta..? Jak by nie patrzeć, prostokąt to więcej niż jeden punkt. |
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-26 20:28:10 Bierz się za politykę. Tyle wody nalać i tak nie odpowiedzieć na pytania..? Nie działa, czyli co? Jest niedokładny, nie łapie w ogóle, czy może coś jeszcze innego..? Jaką pozycję prostokąta podajesz? Pozycję środka prostokąta, rogu prostokąta..? Jak by nie patrzeć, prostokąt to więcej niż jeden punkt.
|
Program który znalazłem w sieci przerobiłem pod SFML, ale on nie wykrywa kolizji w ogóle. Nigdy nie zwraca true. Więc się pytam czy to ja coś sknociłem przerabiając program pod SFML czy ten program jest zły. W SFML pozycja prostokąta to jego lewy górny róg, myślałem, że to oczywiste ;p Sorry, za moją niedokładność i dzięki za cierpliwosć! |
|
pekfos |
» 2014-06-26 20:35:20 W SFML pozycja prostokąta to jego lewy górny róg, myślałem, że to oczywiste ;p |
A jakże by to mogło być nieoczywiste..? The first pair of lines calculate the absolute values of the x and y difference between the center of the circle and the center of the rectangle. |
|
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-26 20:39:47 Czyli teoretycznie ten program jest teraz poprawnie napisany: bool Player::collision( sf::Vector2f a, sf::Vector2f bP, sf::Vector2f b, float c ) { sf::Vector2f circleDistance; circleDistance.x = abs( a.x - bP.x +( b.x / 2 ) ); circleDistance.y = abs( a.y - bP.y +( b.y / 2 ) ); if( circleDistance.x >( b.x / 2 + c ) ) { return false; } if( circleDistance.y >( b.y / 2 + c ) ) { return false; } if( circleDistance.x <=( b.x / 2 ) ) { return true; } if( circleDistance.y <=( b.y / 2 ) ) { return true; } float cornerDistance_sq =( circleDistance.x - b.x / 2 ) *( circleDistance.x - b.x / 2 ) + ( circleDistance.y - b.y / 2 ) *( circleDistance.y - b.y / 2 ); return( cornerDistance_sq <=( c * c ) ); }
|
|
arczi14 Temat założony przez niniejszego użytkownika |
» 2014-06-26 20:47:15 Dzięki za pomoc program gra i buczy! :D
Kod powyżej jest dobry może komuś się przyda więc jeszcze opisze jego zmienne: (q to pozycja koła [pobrana z getPosition()], b to rozmiar prostokąta, Bp to pozycja prostokąta [Dokładnie lewego górnego rogu ], c promień koła ) |
|
« 1 » 2 |