-
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;
}
-
if(_map->Get_Type(idY, idX) == 0 || 1)
c'est ça qu'il faut changer
-
Pourquoi ? Je doit bien déterminer si la case est de type mur ou bloc ...?
-
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)
-
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.