CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [SFML] Gestion des collisions ?

DébutPage précedente
1
Page suivantePage suivante
lesniper53 lesniper53
MP
Niveau 6
15 novembre 2014 à 19:51:40

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 !

hexabeast hexabeast
MP
Niveau 9
15 novembre 2014 à 23:31:27

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.

lesniper53 lesniper53
MP
Niveau 6
16 novembre 2014 à 10:09:42

Ok merci, c'est vrai que je n'y avais pas pensé ! Je vais essayer de faire tout ça, je vous tien au courant :) !

lesniper53 lesniper53
MP
Niveau 6
16 novembre 2014 à 12:03:49

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

lesniper53 lesniper53
MP
Niveau 6
16 novembre 2014 à 12:04:40

( 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 )

hexabeast hexabeast
MP
Niveau 9
16 novembre 2014 à 14:33:56

"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.

Pseudo supprimé
Niveau 10
16 novembre 2014 à 14:58:07

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.

Pseudo supprimé
Niveau 10
16 novembre 2014 à 15:17:11

Je fonctionne comme ça et j'ai l'effet de glissement sur mes tiles :oui:

chiagedeluna chiagedeluna
MP
Niveau 10
16 novembre 2014 à 17:34:27

Si tu sépare pas X et Y, y a des risques de bugs.

Pseudo supprimé
Niveau 10
16 novembre 2014 à 17:55:36

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 :-)

chiagedeluna chiagedeluna
MP
Niveau 10
16 novembre 2014 à 18:00:14

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é.

Pseudo supprimé
Niveau 10
16 novembre 2014 à 20:14:22

Tu as surement raison, car ma fonction qui "amorti" la vitesse gère le déplacement en X et en Y séparément.

lesniper53 lesniper53
MP
Niveau 6
16 novembre 2014 à 20:50:32

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 !

lesniper53 lesniper53
MP
Niveau 6
23 novembre 2014 à 12:54:37

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 :)

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
La vidéo du moment