Hola,
j'aimerais avoir des conseilles sur comment gérer les collisions avec la SFML, j'ai déjà la détection des collision qui se fait avec des rectangles, quand il rentre en collision, mon problème est que faire ? Quand mon personnage rentre en collision avec ma "maison", je ne veut pas qu'il puissent allé sur sa texture ! ( enfin vous m'avez compris :3 ) Du coup j'aimerais savoir si vous avez des techniques/conseilles sur cette gestion précise ! ( ou des tutos au mieux ) J'ai déjà fait en sorte que quand il y a collision le personnage revienne a sa dernière position quand il n'était ne l'était pas ! Mais du coup la texture reviens en arrière tout le temps, je vous laisse imaginé, c'est pas propre ... Merci d'avance, je ne pourrais pas lire directement vos messages, je pense que je pourrais vous répondre que demain !
J'ajoute au truc de whiteapple qu'il vaut mieux faire cette operation 2 fois, d'abord pour x puis pour y:
1) Tu calcules les nouvelles positions du personnages
2) Tu bouges le personnage en x et tu regarde si y'a des collisions
3) Si oui, alors on remet l'ancienne position x
4) Tu bouges le personnage en y et tu regarde si y'a des collisions
5) Si oui, alors on remet l'ancienne position y
Ça te permet de faire longer les murs au personnages sans être bloqué si ton jeu est en "vue du dessus" ou bien de mieux gérer les trucs comme la gravité/les sauts dans un plateformer.
Ok merci, c'est vrai que je n'y avais pas pensé ! Je vais essayer de faire tout ça, je vous tien au courant !
Je n'arrive pas a trouvé une bonne technique :s Je pensais crée un rectangle et tester quand on l’implémente/enlève sa position de 1 si il y a collision, mais si on gère les axe x et y séparément sa fait 4 cas a gérer par collision * le nombre de collision par "niveau" ... Je trouve que ça fait bien trop ! Je pense que j'abuse, mais si vous pouviez me "conduire" sur la bonne route/technique :s
( pour le rectangle, il aurait la même position que l'a texture que la personnage, il serais non visible, un rectangle de collision quoi )
"sa fait 4 cas a gérer par collision * le nombre de collision par "niveau""
Faut pas prendre en compte toutes les collisions du niveau, juste celles proches du joueur.
whiteapplex a raison faut que tu fasse un truc du genre :
1/ récupère la position actuelle de ton personnage dans un sf::Vector2f, tu fais un truc du genre sf::Vector2f position(rectangle.getPosition());
2/ Ensuite tu ajoute à position la vitesse en x et y pour avoir la position future, appelons vx et vy les vitesse en x et y.
Tu dois calculer vx et vy dans une fonction qui gère les touches, si tu appuies sur la flèche gauche vx = -10, si tu appuies sur la flèche droite vx = 10, si tu appuies sur la flèche haut vy = -10, si tu appuies sur la flèche bas vy = 10, sinon vx = vy = 0.
Une fois que tu as vx et vy tu as juste à faire position.x += vx et position.y += vy.
A partir de là position est la future position de ton personnage.
3/ Ici tu calcule les collisions avec position, disons que tu as un rectangle1 avec lequel ton rectangle2 va entrer en collision, tu fais juste :
Si (rectangle1.getPosition().x > position.x + rectangle2.getGlobalBounds().width ||
rectangle1.getPosition().x + rectangle1.getGlobalBounds().width < position.x ||
rectangle1.y > position.y + rectangle2.getGlobalBounds().height ||
rectangle1.y + rectangle1.getGlobalBounds().height < position.y)
Alors pas collision -> rectangle2.setPosition(position);
Sinon
COLLISION -> on ne fait rien.
J'espère que tu auras compris la logique derrière le fait qu'il faut effectuer la détection des collisions sur la future position de ton rectangle, et qu'ensuite il faut réagir.
Je fonctionne comme ça et j'ai l'effet de glissement sur mes tiles
Si tu sépare pas X et Y, y a des risques de bugs.
Ah bon? Pourtant j'en ai pas eu, des bugs de quels genre?
C'est surement parce que j'utilise une autre fonction qui permet de se rapprocher au pixel près de la tile et puis lorsqu'ils sont collé j'annule la vitesse du coup si j'appuie sur les flèches du bas et de la droite et qu'il y a collision à droite, mon sprite ma coulisser vers le bas puisque vx = 0
Si tu te déplace au pixel près, le problème n'est pas visible. Mais dans ton code, on dirait que tu annule tout les déplacement en cas de collision. L'interêt de séparer X et Y, c'est que tu peut bloquer le déplacement en X ou en Y séparément. Le bug qu'on peut avoir en gérant X et Y en même temps, c'est de savoir le long de quoi on fait glisser l'objet si on détecte une collision. On fait glisser verticalement ou horizontalement? T'es obligé de choisir de force, et dans certains cas, quand tu abordera l'obstacle par un angle, tu te retrouvera a glisser sur le mauvais coté.
Tu as surement raison, car ma fonction qui "amorti" la vitesse gère le déplacement en X et en Y séparément.
Merci à tous, free m'a coupé internet cette aprem #PayeTaCo, désolé de ne pas avoir répondu, je vais utilisé vos technique et je vous donne des nouvelles au plus vite !
Donc après 1 semaine (oui je suis un peut long :c) j'ai enfin réussis ! J'ai donc crée un rectangle, comme vous avez dit plus haut, plus communément appelé "hitbox", qui va détecté les collisions avant que le déplacement sois fait. Il ne me reste plus qu'a séparé les axes x et y et tout seras bon ! Je me suis inspiré de ce que vous m'avez dit et repris quelques une de mes idées, et le résultat est pour l'instant parfait ! Si vous avez des questions/conseilles n’hésitez pas ! Dans tout les cas merci