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

Auteur Sujet: Une gestion des collisions propre sous SFML 2.0  (Lu 3464 fois)

0 Membres et 1 Invité sur ce sujet

SJimmy

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Une gestion des collisions propre sous SFML 2.0
« le: Juin 12, 2015, 10:48:21 pm »
Bonsoir, je me dirige vers vous pour échanger à propos de la gestion des collisions "proposé" par défaut.

En effet, pour me remettre dans le bain, j'ai pondu un petit Pong, simple, basique, sans menu ou score pour le moment, et il est proposé dans la SFML une gestion des collisions (basique je pense) via la fonction intersect().

Pour faire simple, par moment lorsque la balle entre en collision avec la barre, surtout quand elle vient à sa rencontre via l'arrête supérieur du rectangle, elle se loge à l'intérieur, rebondis tout le long et finis par reprendre un comportement standard de déplacement une fois l'autre extrémité atteinte. Disons qu'elles entre et sors de la barre.

Pour arrivé à cela, j'ai une classe Balle qui contient le sf::Sprite à gérer, pareil pour la barre et j'utilise :
    if(m_balle.GetSprite().getGlobalBounds().intersects(m_barre1.GetSprite().getGlobalBounds()))
    {
        m_balle.ReverseX();
    }

Je fais le même teste dans la gestion des collisions en Y pour inversé Y,le tout séparé dans une autre méthode.

Pour palier à ce "problème", j'ai essayé d'utiliser quelques conditions à base de
   
if(bord gauche de la balle left <= bord droit de la barre left+widht || bord droit de la balle left+widht >= bord gauche de la barre left)
{
    if(bord haut de la balle top  >= bord haut de la barre top+height || bord bas de la balle top+height <= bord bas de la barre top)
    {
          On inverse le sens car collision;
    }
}

Mais cela n'a fais que moins bien son travail.
Je souhaitais savoir si quelqu'un avait une approche différent du problème, un pattern à suivre.

Cordialement et bonne soirée.
« Modifié: Juin 12, 2015, 11:05:51 pm par SJimmy »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #1 le: Juin 12, 2015, 11:07:12 pm »
Ben déjà quand tu check si ta balle intersect ta barre, si c'est true c'est que ta balle est dans ta barre. Même si tu inverses sa vitesse elle ne va pas forcément en sortir magiquement.
Donc s'il y a une collision, alors sors d'abord ta balle de ta barre (tu la déplaces au bord, de façon à ce que la collision n'existe plus) puis inverse sa vitesse.

Sinon ta solution au problème c'est pas exactement la même chose que ce que fait intersect ??

SJimmy

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #2 le: Juin 12, 2015, 11:31:13 pm »
Hum, j'avais pas vu ça comme ça, de la repositionner.
Mais en effet, j'aurais pu et du y penser.

Par rapport à ma "solution", disons plutôt que j'ai essayé de reproduire intersect (ce qui n'a pas très bien fonctionné) tout en pouvant y récupérer par la suite différent paramètre, comme l'endroit exact ou j'ai tapé sur la barre, histoire de définir un angle (donc un vitesse de déplacement en X ou en Y qui changerais).

Bref je pense que ton "rappel à l'ordre" sur le repositionnement va pas mal solver mon problème.
Reste à savoir comment utiliser émuler la fonction intersect afin de modifier le comportement, et pas juste ce dire "Tiens je me suis cogner à ta barre" ^^
Merci.

EDIT : nvm, je pense avoir compris comment parvenir à cela à coup de if :D
« Modifié: Juin 12, 2015, 11:33:33 pm par SJimmy »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #3 le: Juin 13, 2015, 01:01:24 am »
Pour dévier l'angle de la balle suivant l'endroit où elle tape sur la barre tu peux tout simplement calculer la distance verticale entre le milieu de la barre et le milieu de la balle au moment de la collision. Si tu divises cette distance par la demi-longueur de la barre, tu obtiens un pourcentage qui t'indique où la balle a tapé : 0% c'est au centre, 100% c'est tout au bout de la barre.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #4 le: Juin 13, 2015, 08:32:10 am »
1. N'oublie pas que le code source de intersect est disponible

2. Cette fonction peut prendre en paramètre optionnel un rectangle qui sera rempli avec l'intersection, ce qui peut te permettre de savoir plus exactement où a eu lieu la collision
Laurent Gomila - SFML developer

fetyal

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #5 le: Mars 01, 2016, 11:42:38 am »
Svp JE SUIS NOVICE EN MATIERE PROGRAMMATIION SOUS SFML comment faire pour que la balle ne reste pas bloqué sur le paddle lors de la collision avec la fonction intersect : plus de detail sur le deplacement de balla sur le paddle et l invertion de sa trajectoire merci surtout le commentaire de G ""tu la déplaces au bord, de façon à ce que la collision n'existe plus) puis inverse sa vitesse....comment faire ????

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #6 le: Mars 01, 2016, 02:25:53 pm »
Exemple.
Tu détectes une collision entre le paddle de droite et la balle.
Le bord gauche du paddle de droite est à 480 px.
La balle fait 20 px de largeur (ou de rayon).
Pour que la balle ne soit plus en collision avec le paddle, tu la déplaces à 480px - 20px (position du bord gauche du paddle - largeur de la balle).

Pour que ta balle se déplace, tu lui as donné une vitesse non ? (que ça soit en pixels par seconde ou en pixels par frame)
Quand ta balle va à droite, elle a une vitesse qu'on appelera vitesseX. Quand tu touches le paddle de droite, tu mets la vitesse à vitesseX = -vitesseX

fetyal

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Re : Une gestion des collisions propre sous SFML 2.0
« Réponse #7 le: Mars 04, 2016, 05:45:00 pm »
j essaye de reproduire et de comprendre l excellent tutoriel du jeu pong  ( pour les initiés comme moi) dont voici le lien http://progsv.epfl.ch/www/tutorial-sfml/tutorial/collisions.php , tous marche à merveille sauf l effet de rebond que je n 'arrive pas à avoir avec les paddles , pourquoi ???? j ai eu le même problème que celui décrit auparavant par l'un des membres de la communauté : y a t 'il un oubli dans le code ; j 'en doute puisque ce jeu pong est un exercice pratique entrant dans le cours d'informatique de l'université de LAUSANNE de 2 année , le code étant rechargeable ( la version simple )  quelqu'un pourra t'il avoir l’amabilité de m aider à résoudre ce problème  en essayant le code SVP ??