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

[SFML 2.0]Kolizja boxowa

Ostatnio zmodyfikowano 2015-03-18 14:44
Autor Wiadomość
GGG205
Temat założony przez niniejszego użytkownika
[SFML 2.0]Kolizja boxowa
» 2015-03-18 11:32:30
Cześć! Robię grę podobną do flappy birtha na kwadratach, aby obsłużyć błędy używam kolizji boxowej, ale nie działa postać dalej przechodzi przez bloki.

Zastanawiam się czy obiekty mają złe wartości, ale gdy sprawdzałem nic takiego nie znalazłem.

KOD generowaniu bloczku i obsługi kolizji:

C/C++
class Game
{
private:
    vector < Block > BlDown;
    vector < Block > BlUp;
    Block bl;
    Character kieryk;
public:
    Game()
        : kieryk( 300, 300, "Glowa.png" )
    {
       
       
        for( int i = 0; i < 3; i++ )
        {
            BlDown.push_back( bl );
            BlUp.push_back( bl );
            BlDown[ i ].SetPos( 800 +( i * 300 ), 450 );
            BlUp[ i ].SetPos( 800 +( i * 300 ),( rand() % 20 ) * 2 );
        }
    }
   
    void start( RenderWindow & wnd )
    {
        kieryk.update( wnd );
        for( int i = 0; i < 3; i++ )
        {
            BlDown[ i ].Move();
            BlUp[ i ].Move();
           
            if( BlDown[ i ].GetPos().x <= - 121 )
            {
                BlDown[ i ].SetPos( 800, 450 );
            }
            if( BlUp[ i ].GetPos().x <= - 121 )
            {
                BlUp[ i ].SetPos( 800, 0 );
            }
            //if(BlUp[i].Collision(kieryk) == true)
            //wnd.close();
           
            if( kieryk.getPosition().x + 76 >= BlUp[ i ].GetPos().x &&
            kieryk.getPosition().x <= BlUp[ i ].GetPos().x + 121 &&
            kieryk.getPosition().y + 115 >= BlUp[ i ].GetPos().y &&
            kieryk.getPosition().y <= BlUp[ i ].GetPos().y + 184 )
                 wnd.close();
           
            BlDown[ i ].draw( wnd );
            BlUp[ i ].draw( wnd );
        }
       
       
    }
};

Bloki poruszają się za pomocą tej funkcji:
speed = 0.2f;
C/C++
void Move()
{
    blok.move(( - 1 ) * speed, 0.0f );
    pos.x = blok.getPosition().x;
    pos.y = blok.getPosition().y;
}

Postać lata za pomocą tej funkcji:
C/C++
void Fly()
{
    if( Keyboard::isKeyPressed( Keyboard::Space ) )
         vector.y -= 0.006;
   
    FlyKieryk.move( 0, vector.y );
    vector.y += 0.001;
}
P-128673
Brunon3
» 2015-03-18 14:44:02
Kiedyś napisałem taką kolizję, nie jest to jakieś dzieło sztuki (czy tam kodu), ale zawsze coś:

C/C++
void App::Player_Collision( int x, int y, int w, int h ) {
    if( world.isScreenScroll ) { //Ten if jest u Ciebie niepotrzebny, u mnie jest sprawdzenie czy gracz jest na dworze, czy w pomieszczeniu
        //RIGHT COLLISION ( object right wall, player left wall )
        if(( player.y <=(( y ) + h ) ) &&( player.y + player.h >=( y ) ) )
        {
            if(( player.x <=( x + w ) ) &&( player.x >= x + w / 2 ) ) {
                player.camera.x += 1 - world.speed;
            }
        }
        //LEFT COLLISION ( object left wall, player right wall )
        if(( player.y <=(( y ) + h ) ) &&( player.y + player.h >=( y ) ) )
        {
            if(( player.x + player.w ) >= x &&( player.x + player.w <= x + w / 2 ) ) {
                player.camera.x -= 1 - world.speed;
            }
        }
        //UP COLLISION ( object up wall, player down wall )
        if(( player.x <=( x + w ) &&( player.x + player.w >= x ) ) )
        {
            if((( player.y + player.h ) >= y ) &&( player.y + player.h <= y + h / 2 ) ) {
                player.y -= 1 - world.speed;
            }
        }
        //DOWN COLLISION ( object down wall, player up wall )
        if(( player.x <=( x + w ) ) &&( player.x + player.w >= x ) )
        {
            if( player.y <=( y + h ) && player.y >= y + h / 2 ) {
                player.y += 1 - world.speed;
            }
        }
    }
}

Gdzie "x, y, w, h" to pozycje boxa, a "player.camera.x, itd." to pozycje kamery gracza (wszystkie grafiki są od tej zmiennej odejmowane).

-BD.
P-128689
« 1 »
  Strona 1 z 1