Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: soucis de collision  (Lu 2736 fois)

0 Membres et 1 Invité sur ce sujet

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
soucis de collision
« 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;
}
« Modifié: Juin 16, 2012, 08:40:47 pm par cChaD »

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : soucis de collision
« Réponse #1 le: Juin 17, 2012, 12:03:41 am »
if(_map->Get_Type(idY, idX) == 0 || 1)
c'est ça qu'il faut changer

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : soucis de collision
« Réponse #2 le: Juin 17, 2012, 12:39:32 am »
Pourquoi ? Je doit bien déterminer si la case est de type mur ou bloc ...?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : soucis de collision
« Réponse #3 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)
Laurent Gomila - SFML developer

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : soucis de collision
« Réponse #4 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.