Partage
  • Partager sur Facebook
  • Partager sur Twitter

sfml avancer en fonction de la rotation

Sujet résolu
Anonyme
    22 août 2022 à 19:06:07

    Bonjour, je cherche à faire avancer en continue un sprite en fonction de sa rotation. Je tiens à préciser que sa rotation change tout le temps et que la fonction s'occupant de ça marche trés bien.

    Voici la ligne que j'ai essayé (qui est dans la boucle d'sfml)

    move(cos(this->getRotation()), sin(this->getRotation()));

    la plupart du temps le sprite avance bien mais dés que son orientation est environ égal à 0 (donc le sprite est orienté vers le haut de l'écran), il s'arrête d'avancer et se met à reculer. j'ajoute aussi que quand le sprite avance en meme temps qu'il tourne, il se met à trembler (je pense que c'est parce qu'il recule et avance en meme temps)

    merci de vos réponses et de votre aide ^^

    -
    Edité par Anonyme 26 août 2022 à 13:27:28

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      25 août 2022 à 20:24:16

      je pense avoir oublié de préciser ça quand le sprite est orienté à 0 (donc vers le haut) le sinus est également à 0 (logique maic'est la que ça coince pour avancer) alors que quand le cosinus est égal à 0 (donc le sprite est orienté à 90°) ça marche. Aussi, Je pense aussi que les 2 problèmes cités plus haut sont liés (quand il "tremble" et quand il recule)

      voila

      cordialement

      -
      Edité par Anonyme 26 août 2022 à 17:14:04

      • Partager sur Facebook
      • Partager sur Twitter
        28 août 2022 à 21:44:08

        Salut,

        La fonction getrotation de SFML donne un angle en degré, or les fonctions cos et sin demandent un angle en radian.

        Donc il faut convertir (radian = (degre/180)*Pi)

        De plus, quand tu dis orienté en 0 (donc vers le haut), je ne suis pas forcément d'accord, car en trigo, l'angle 0 est orienté vers la droite.

        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        Anonyme
          29 août 2022 à 19:09:25

          bonjour et merci pour ta réponse,

          j'ai converti l'angle en radian (ce qui est logique mtn que tu le dis)

          move(cos(this->getRotation() * 180 / 3.1415927f), sin(this->getRotation() * 180 / 3.14159276f));

          mais c'est pire qu'avant, il n'avance plus et "tremble" (quand je dis qu'il "tremble",  c'est qu'il avance et recule en même temps) comme quand il tourne.

          et désolé pour le "orienté en 0"

          cordialement

          -
          Edité par Anonyme 29 août 2022 à 19:10:40

          • Partager sur Facebook
          • Partager sur Twitter
            29 août 2022 à 22:37:32

            Salut, 

            non, tu as converti dans le mauvais sens. Essaie ça :

            move(cos((this->getRotation() / 180) * 3.1415927f), sin((this->getRotation() / 180) * 3.14159276f));
            



            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            Anonyme
              29 août 2022 à 23:04:36

              ah oui effectivement,

              mais ça ne marche pas le sprite avance en cercle autour du point vers lequel il devait avancer

              -
              Edité par Anonyme 29 août 2022 à 23:04:46

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                30 août 2022 à 23:36:03

                c'est bon, sujet résolu !

                j'ai directement passé la fonction me permettant de calculer l'angle (atan2) en argument à cosinus et à sinus au lieu de passer par getRotation et de faire des conversions inutiles

                //recupère l'abcisse de la position de la souris sur la fenêtre moins l'abscisse actuelle du sprite
                float x = m_fenetre->mapPixelToCoords(sf::Mouse::getPosition(*m_fenetre)).x - getPosition().x;
                //recupère l'ordonnée de la position de la souris sur la fenêtre moins l'ordonnée actuelle du sprite
                float y = m_fenetre->mapPixelToCoords(sf::Mouse::getPosition(*m_fenetre)).y - getPosition().y;
                 
                float rotationActuelle{ getRotation() };
                double angle{};
                 
                if (rotationActuelle != RotLast)
                {
                        angle = atan2f(y, x);
                        RotLast = rotationActuelle;
                        CosLast = cos(angle);
                        SinLast = sin(angle);
                }
                 
                setRotation(angle * 180 / PI);
                 
                move(CosLast, SinLast);


                merci à toi fvirtman

                cordialement

                -
                Edité par Anonyme 30 août 2022 à 23:38:43

                • Partager sur Facebook
                • Partager sur Twitter

                sfml avancer en fonction de la rotation

                × 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