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

Kolizja okrąg vs okrąg (obecne wątki na forum mi nie pomogły )

Ostatnio zmodyfikowano 2014-01-28 09:46
Autor Wiadomość
Madrei
Temat założony przez niniejszego użytkownika
Kolizja okrąg vs okrąg (obecne wątki na forum mi nie pomogły )
» 2014-01-27 19:58:54
C/C++
#include <SFML/Graphics.hpp>
#include <cmath>
class COb
{
private:
    sf::CircleShape Rec;
    float roz;
    float Px, Py;
public:
    void setX( float ix ) { roz = ix; }
    float getX() { return roz; }
    void setPX( float ix ) { Px = ix; }
    void setPY( float ix ) { Py = ix; }
    float getPX() { return Px; }
    float getPY() { return Py; }
    void Pozycja() { Rec.setPosition( Px, Py ); }
    void rysuj( sf::RenderWindow & okno ) { okno.draw( Rec ); }
    COb() { setX( 20 ); setPX( 50 ); setPY( 50 ); Rec.setRadius( roz ); Rec.setPosition( Px, Py ); }
    COb( float ix, float iy, float ir ) { setX( ir ); setPX( ix ); setPY( iy ); Rec.setRadius( roz ); Rec.setPosition( Px, Py ); }
    ~COb() { }
};
int main()
{
   
    sf::RenderWindow app( sf::VideoMode( 800, 600 ), "Kolizje" );
    COb r1( 100, 100, 10 );
    COb r2( 100, 200, 20 );
    bool koliz = false;
   
   
    while( app.isOpen() )
    {
       
        sf::Event event;
        while( app.pollEvent( event ) )
        {
           
            if( event.type == sf::Event::Closed )
                 app.close();
           
            if(( pow( pow(( r1.getPX() + r2.getPX() ), 2 ) + pow(( r1.getPY() + r2.getPY() ), 2 ), 2 ) ) <= pow(( r1.getX() + r2.getX() ), 2 ) )
            { koliz = true; }
            if( koliz == true ) { r1.setPX( 3 ); r1.setPY( 3 ); }
            if( koliz != true )
            {
                if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A )
                { float a = r1.getPX() - 1; r1.setPX( a ); }
                if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::D )
                { float a = r1.getPX() + 1; r1.setPX( a ); }
                if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W )
                { float a = r1.getPY() - 1; r1.setPY( a ); }
                if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S )
                { float a = r1.getPY() + 1; r1.setPY( a ); }
            }
           
        }
       
       
        app.clear( sf::Color( 10, 20, 100, 200 ) );
       
        r1.Pozycja();
        r2.Pozycja();
        r1.rysuj( app );
        r2.rysuj( app );
       
       
        app.display();
    }
   
    return EXIT_SUCCESS;
}

Dlaczego nie wykrywa kolizji ??
P-103351
alixir
» 2014-01-27 20:24:42
Na moje oko
if(( pow( pow(( r1.getPX() + r2.getPX() ), 2 ) + pow(( r1.getPY() + r2.getPY() ), 2 ), 2 ) ) <= pow(( r1.getX() + r2.getX() ), 2 ) )

zły warunek.

Według mnie powinien wyglądać tak:
if( sqrtf( pow(( r1.getPX() - r2.getPX() ), 2 ) + pow(( r1.getPY() - r2.getPY() ), 2 ) ) <=( r1.getX() + r2.getX() ) )
P-103354
pekfos
» 2014-01-27 22:14:00
Według mnie powinien wyglądać tak:
Tylko potęga była zła, w jednym pow(). Poza tym, pchanie się w pierwiastki to zły pomysł.
P-103377
Madrei
Temat założony przez niniejszego użytkownika
» 2014-01-28 09:46:49
Dzięki za podpowiedź działa. 2 błędy:
- nie wiem po co dodawałem współrzędne :D.
- nie pierwiastkuje prawej strony to powinienem podnieść prawą do kwadratu
i skoro podniosłem całość do 2 potęgi to wychodzi że mam 4 po prawej :)
    
P-103391
« 1 »
  Strona 1 z 1