Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML 2.0 Kolizje Prostokąt - koło

Ostatnio zmodyfikowano 2014-06-27 15:51
Autor Wiadomość
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:
C/C++
// ZE STRONY: http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection

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:
C/C++
bool Player::collision( sf::Vector2f a, sf::Vector2f bP, sf::Vector2f b, float c )
{
    // Sprawdzanie kolizji
    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!
P-112787
pekfos
» 2014-06-26 20:02:24
Kod podany wyżej nie działa.
Czyli..?

Bp to pozycja prostokąta
Czyli..? Środka? Rogu?
P-112800
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
P-112806
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.
P-112807
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ć!
P-112810
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.
P-112812
arczi14
Temat założony przez niniejszego użytkownika
» 2014-06-26 20:39:47
Czyli teoretycznie ten program jest teraz poprawnie napisany:
C/C++
bool Player::collision( sf::Vector2f a, sf::Vector2f bP, sf::Vector2f b, float c )
{
    // Sprawdzanie kolizji
    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 ) );
}
P-112813
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 )
P-112815
« 1 » 2
  Strona 1 z 2 Następna strona