Forum de la communauté SFML

Aide => Général => Discussion démarrée par: cChaD le Juin 16, 2012, 07:03:58 pm

Titre: soucis de collision
Posté par: cChaD le Juin 16, 2012, 07:03:58 pm
Bonsoir,

J'essaye de recréer un bomberman histoire de bien maîtriser la SFML, mais je coince au niveau des collisions..

J'ai une classe Map et Case et dans Map je dispose d'un vector[Y][X] de case, chaque cases prend en paramètre un type, 0 = bloc, 1 = mur, 2=herbe tous ça lut grâce à un fichier .txt

Mais lorsque je test les collisions, le rect de mon perso et de la case sa ne marche pas...  :-X

IntRect Case::GetBoundingBox() const
{
    IntRect box;
    box.left = (int)Get_Position(_type).x;
    box.top = (int)Get_Position(_type).y;
    box.width = 30;
    box.height = 30;

    return box;
}

IntRect Player::GetBoundingBox() const
{
    IntRect rect;
    rect.left = (int)vel.x+1;
    rect.top = (int)vel.y;
    rect.width = 20;
    rect.height = 28;

    return rect;
}

bool Player::collision()
{
    if(bouger)
    {
        int idY = GetBoundingBox().top / 30; // grâce à ça je peut connaitre la case en Y de mon perso
        int idX = GetBoundingBox().left / 30; // ici en X

       cout << _map->Get_Type(idY, idX) << endl;

        if(_map->Get_Type(idY, idX) == 0 || 1)
        {
            if(GetBoundingBox().left <= _map->GetBoundingBox(idY, idX).left + _map->GetBoundingBox(idY, idX).width)
                return true;
        }
    }

    return false;
}
Titre: Re : soucis de collision
Posté par: lezebulon le Juin 17, 2012, 12:03:41 am
if(_map->Get_Type(idY, idX) == 0 || 1)
c'est ça qu'il faut changer
Titre: Re : soucis de collision
Posté par: cChaD le Juin 17, 2012, 12:39:32 am
Pourquoi ? Je doit bien déterminer si la case est de type mur ou bloc ...?
Titre: Re : soucis de collision
Posté par: Laurent le Juin 17, 2012, 09:37:45 am
Ta conditon signifie :

SI _map->Get_Type(idY, idX) == 0
OU
1
Et l'expression "1" est toujours vraie.

Tu ne peux pas écrire une condition en C++ comme en langage courant, dans lequel on fait des raccourcis.

Il faut écrire :

if (_map->Get_Type(idY, idX) == 0 || _map->Get_Type(idY, idX) == 1)
Titre: Re : soucis de collision
Posté par: cChaD le Juin 17, 2012, 10:32:10 am
Merci Laurent, mais comment dire je ne sait pas comment interpréter ça dans le code, je voudrais que mon personnage puisse repartir par la suite mais vu que ma condition est toujours vrai

 
if (_map->Get_Type(idY, idX) == 0 || _map->Get_Type(idY, idX) == 1)

Je n'arrive pas à dire au programme, si mon pour perso +1px est sur une case de type 0 ou 1 que le joueur soit bloquer mais qu'il puisse quand même aller dans une autre direction...

    if(Keyboard::isKeyPressed(Keyboard::Down))
    {
        bouger = true;

        if(!collision()) {
            vel.y += 0.1f;
            _animation->setAnimation(0); }
    }


Et je me disait aussi, esque j'ai vraiment besoin de ça ?

            if(GetBoundingBox().left <= _map->GetBoundingBox(idY, idX).left + _map->GetBoundingBox(idY, idX).width)
                return true;

car je test déjà grâce à ça :

        int idY = GetBoundingBox().top / 30; // grâce à ça je peut connaitre la case en Y de mon perso
        int idX = GetBoundingBox().left / 30; // ici en X

Merci d'avance.