Bonjour/Bonsoir
Tout d’abord merci d'avance pour votre aide et attention
Je n'ai pas trouvé la réponse à mes questions sur internet ou sur ce forum donc je viens poser la question ici.
J'ai conçus une fonction pour tester les collisions entre une TileMap et un RectangleShape et celle-ci fonctionne parfaitement
enfin presque..
J'ai pris pour parti de récupérer les 4 coins de mon rectangle et de les tester deux par deux pour savoir si il touche un plafond, un sol ou un mur afin de réagir correctement, voici le code :
void Collision::TileCollision(const sf::RectangleShape& rect,const std::vector<std::vector<int>>& v, sf::Vector2f& moveSprite, int numVide)
{
int j1 = rect.getPosition().x/32; //coordonné x de la tuile
int i1 = rect.getPosition().y/32; //coordonné y de la tuile
int j2 = (rect.getPosition().x + rect.getSize().x -1)/32;
int i2 = (rect.getPosition().y + rect.getSize().y -1)/32;
if((v[i1][j1] != numVide) && (v[i1][j2] != numVide)) //mur de gauche(left);
moveSprite.y++;
else if((v[i2][j1] != numVide) && (v[i2][j2] != numVide)) //mur de droite(right);
moveSprite.y--;
if((v[i1][j1] != numVide) && (v[i2][j1] != numVide)) //plafond(up);
moveSprite.x++;
else if((v[i1][j2] != numVide) && (v[i2][j2] != numVide)) //sol(down);
moveSprite.x--;
}
Pour l'explication :
rect : est mon rectangle
v : est mon tableau contenant ma map en int
moveSprite : est celui qui enregistre tous les mouvements de mon rect, que je multiplie par une vitesse lors de l'appel de draw()
numVide : est le chiffre qui représente le vide dans mon tableau
Maintenant que la mise en situation est faite, MON PROBLÈME :
Rarement(il me faut au moins une dizaine d'essai à chaque fois) et avec un angle précis, le personnage peut forcer le passage a travers un mur en passant par un coin.
Le fait est que, dans mon test de collision, je n'agis que si 2 coins sont dans un murs.
Malheureusement, Je ne peux pas agir avec un seul coin, car je ne sais pas où renvoyé le rectangle.
Ma question est donc : que dois-je faire d'après vous, pour éviter que le rectangle puisse forcer le passage ?
Merci encore pour votre aide et attention.
Bonne journée