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

Kolizje obiektów - "przeszkadzanie sobie"

Ostatnio zmodyfikowano 2015-02-27 17:10
Autor Wiadomość
Brunon3
Temat założony przez niniejszego użytkownika
Kolizje obiektów - "przeszkadzanie sobie"
» 2015-02-24 14:19:46
Witam. Otóż mam problem; napisałem obsługę kolizji z graczem w klasie GameObject, i wszystko pięknie działało dopóki nie zrobiłem kilka instancji obiektów tej klasy. Wtedy obiekty "przeszkadzają sobie" w ten sposób, że każdy sprawdza czy gracz z nim koliduje i jeżeli tak, ustawia zmienną ze struktury collider w obiekcie gracza na true, else na false. Przez to liczy się "zdanie" tylko obiektu, którego Update() został wywołany jako ostatni przed Update()'em gracza. Próbowałem to usprawnić na wiele sposobów, ale mi się nie udało. Proszę więc tu o pomoc.

Kod:
C/C++
void GameObject::collision( Player & gracz, GameObject & objekt )
{
    //RIGHT COLLISION ( object right wall, player left wall )
    if(( gracz.y <=(( objekt.y - gracz.camera.y ) + objekt.h ) ) &&( gracz.y + gracz.h >=(( objekt.y - gracz.camera.y ) ) ) )
    {
        if(( gracz.x ==(( objekt.x - gracz.camera.x ) + objekt.w ) ) ) {
            gracz.collision.left = true;
        }
        else gracz.collision.left = false;
       
    }
    else gracz.collision.left = false;
    //LEFT COLLISION ( object left wall, player right wall )
    if(( gracz.y <=(( objekt.y - gracz.camera.y ) + objekt.h ) ) &&( gracz.y + gracz.h >=(( objekt.y - gracz.camera.y ) ) ) )
    {
        if((( gracz.x + gracz.w ) ==( objekt.x - gracz.camera.x ) ) ) {
            gracz.collision.right = true;
        }
        else gracz.collision.right = false;
       
    }
    else gracz.collision.right = false;
    //UP COLLISION ( object up wall, player down wall )
    if(( gracz.x <=(( objekt.x - gracz.camera.x ) + objekt.w ) ) &&( gracz.x + gracz.w >=(( objekt.x - gracz.camera.x ) ) ) )
    {
        if((( gracz.y + gracz.h ) ==( objekt.y - gracz.camera.y ) ) ) {
            gracz.collision.down = true;
        }
        else gracz.collision.down = false;
       
    }
    else if( gracz.collision.down ) gracz.collision.down = false;
    //DOWN COLLISION ( object down wall, player up wall )
    if(( gracz.x <=(( objekt.x - gracz.camera.x ) + objekt.w ) ) &&( gracz.x + gracz.w >=(( objekt.x - gracz.camera.x ) ) ) )
    {
        if( gracz.y ==(( objekt.y + objekt.h ) - gracz.camera.y ) ) {
            gracz.collision.up = true;
        }
        else gracz.collision.up = false;
       
    }
    else gracz.collision.up = false;
   
}
C/C++
void Player::Update( BITMAP * bitmap ) {
    if( key[ KEY_UP ] && collision.up == false )
         camera.y--;
   
    if( key[ KEY_DOWN ] && collision.down == false )
         camera.y++;
   
    if( key[ KEY_LEFT ] && collision.left == false )
         camera.x--;
   
    if( key[ KEY_RIGHT ] && collision.right == false )
         camera.x++;
   
    App::drawBITMAP( bitmap, x, y, w, h );
}
Pozdrawiam, Brunon.

EDIT:
Pomoże ktoś?
P-127311
pekfos
» 2015-02-25 20:22:35
Ustawiaj wyłącznie na true, a false ustaw raz, przed sprawdzeniem wszystkich kolizji?
P-127372
pekfos
» 2015-02-25 20:34:02
Ustawiaj wyłącznie na true, a false ustaw raz, przed sprawdzeniem wszystkich kolizji?
P-127373
Brunon3
Temat założony przez niniejszego użytkownika
» 2015-02-27 17:10:50
Już sobie poradziłem. :)
Nagle dostałem "oświecenia". :D
Odwołuję się do pozycji bezpośrednio.
P-127461
« 1 »
  Strona 1 z 1