Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML collisions objet bug

    10 avril 2022 à 22:11:00

    Salut, j'ai un problème sur sfml en c++, j'essaye de créer un jeu avec des rectangles qui peuvent se pousser : il y à une balle et une raquette controlée par le joueur qui renvoie la balle. J'ai fait les conditions de collisions qui marchent assez bien seul problème quand la raquette rentre trop vite dans la balle, la balle bug : soit elle reste bloqué dedans ou elle rentre puis ressort avec une collision aléatoire rapidement. 

    Voici le code des collisions :

    void updateRect() {
    
        rectanglePosX += RectangleDir.x * RectangleSpeed;
        rectanglePosY += RectangleDir.y * RectangleSpeed;
    
        
    
        // verification collision en Y superieur
        if (((rectanglePosY + rectangleHeight) > raquetteY
            && rectanglePosY < (WIN_HEIGHT - (WIN_HEIGHT - raquetteY))
            && (rectanglePosX) < (raquetteX + raquetteWidth)
            && (rectanglePosX) > raquetteX)
            || ((rectanglePosY + rectangleHeight) > raquetteY
                && rectanglePosY < (WIN_HEIGHT - (WIN_HEIGHT - raquetteY))
                && (rectanglePosX + 20) < (raquetteX + raquetteWidth)
                && ((rectanglePosX + 20) > raquetteX))) {
            RectangleDir.y *= -1;
        }
    
        //verification collision Y inferieur
        if ((rectanglePosY < (raquetteY + raquetteHeight)
            && (rectanglePosY > raquetteY)
            && (rectanglePosX > raquetteX)
            && (rectanglePosX < (raquetteX + raquetteWidth)))
            || (rectanglePosY < (raquetteY + raquetteHeight)
                && (rectanglePosY > raquetteY)
                && ((rectanglePosX + 20) > raquetteX)
                && ((rectanglePosX + 20) < (raquetteX + raquetteWidth)))) {
            RectangleDir.y *= -1;
        }
        // detection colision X gauche
        if (((rectanglePosX + rectangleWidth) > raquetteX
            && (rectanglePosX < (raquetteX + raquetteWidth))
            && (rectanglePosY + raquetteHeight) > raquetteY
            && rectanglePosY < (raquetteY + raquetteHeight))
            || ((rectanglePosX + rectangleWidth) > raquetteX
                && (rectanglePosX < (raquetteX + raquetteWidth))
                && (rectanglePosY + 20) > raquetteY
                && (rectanglePosY + 20) < (raquetteY + raquetteHeight))) {
    
            RectangleDir.x *= -1;
        }
    
        // detection collision X droite
        if ((rectanglePosX < (raquetteX + raquetteWidth)
            && (rectanglePosX > raquetteX + raquetteWidth)
            && rectanglePosY> raquetteY
            && rectanglePosY < (raquetteY + raquetteHeight))
            || ((rectanglePosX < (raquetteX + raquetteWidth)
                && (rectanglePosX > raquetteX))
                && (rectanglePosY + raquetteHeight) > raquetteY
                && (rectanglePosY + rectangleHeight) < (raquetteY))) {
    
            RectangleDir.x *= -1;
            cout << "droite" << endl;
        }
    
    }



    et voici à quoi ressemble le graphisme en bleu la raquette controlé et en rouge la balle qui bouge seule.

    Merci d'avance de votre aide:)

    -
    Edité par HIRUKOTV 10 avril 2022 à 22:11:58

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2022 à 23:27:29

      Quand il y a une collision, tu change la direction mais ce n'est pas suffisant, par exemple si la balle est rentrée dans la raquette, il se peut qu'elle reste dedans lors de l'update suivante malgré le changement de direction. Il faudrait déplacer la balle pour faire en sorte qu'elle ne soit plus en collision
      • Partager sur Facebook
      • Partager sur Twitter
        11 avril 2022 à 1:00:09

        Salut,

        Quelque chose me dit que tu fait tes tests de collision après avoir déplacé tes entités.
        Je préconise l'approche opposée:
        1) Calculer la prochaine position des entités.
        2) Faire les tests de collisions.
        3) Déplacer les entités.

        • Partager sur Facebook
        • Partager sur Twitter

        SFML collisions objet bug

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown