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

Auteur Sujet: Bug de rotation "smooth"  (Lu 3336 fois)

0 Membres et 1 Invité sur ce sujet

Gama31

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Bug de rotation "smooth"
« le: Mars 16, 2022, 11:03:18 pm »
Bonjour à tous, :D

Après avoir cherché un peu partout sur internet je n'ai toujours pas trouvé de solution à un problème concernant la rotation de mon joueur.
Dans mon jeu, j'essaye de faire en sorte que mon joueur se tourne doucement vers ma souris.

Voici le code pour calculer l'angle de mon joueur:
void Player::SetAngle()
{
        sf::Vector2i mousePos = sf::Mouse::getPosition(GD->m_window);

        //Coordonées de la souris dans le monde
        mousePos = (sf::Vector2i)GD->m_window.mapPixelToCoords(mousePos);

        float newAngle = atan2f(mousePos.y - m_pos.y, mousePos.x - m_pos.x) * 180 / PI;

        m_angle += (newAngle - m_angle) / 10.0f;

        m_hitbox.setRotation(m_angle);
}
 

Voici un exemple visuel du type de rotation que je veut faire:
https://youtu.be/ciT_jDol9G8?t=186

Mon code marche bien sauf quand mon joueur est orienté vers la gauche puisque dans la sfml l'angle vers la gauche vaut -180 ou 180 selon le côté où l'on se trouve.
Ce qui fait que quand mon joueur veut passer, par exemple, de -175 à 175 (donc une rotation de 10 degrés dans mon cas) il fait tout le tour.

J'aimerais savoir comment régler ce problème merci d'avance ! ;D

Talchane

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
    • E-mail
Re: Bug de rotation "smooth"
« Réponse #1 le: Mars 17, 2022, 01:31:42 pm »
Bonjour Gama31,
Si j'ai bien compris ton problème, tu ne sais pas comment faire pour connaître le bon sens de rotation, autrement dit la direction avec la distance la plus courte à parcourir.
Tu as un angle entre -180° et 180°. Il te suffit de faire une condition pour comparer les complémentaires à 360° de tes 2 possibilités avant de changer la valeur de m_angle pour savoir dans quelle direction aller.

Plus concrètement :
Tu calcules l'angle thêta = la valeur absolue de la différence entre les 2 angles (pour obtenir l'angle entre les 2).
Ensuite, si cette valeur est plus petite que 180, alors c'est le chemin le plus court.
Sinon tu prends l'autre direction (360 - thêta).
J'espère avoir été clair et avoir résolu ton problème !
Cdt,
Talchane

Gama31

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re: Bug de rotation "smooth"
« Réponse #2 le: Mars 17, 2022, 10:02:06 pm »
Alors après une bonne heure à tester pas de mal de choses et en remplaçant les + par des - j'ai finalement réussi à avoir un code qui marche !

Merci beaucoup Talchane pour l'aide ;D

Voici mon code (que je vais compacter par la suite) pour ceux qui veulent:
void Player::SetAngle()
{
        sf::Vector2i mousePos = sf::Mouse::getPosition(GD->m_window);

        //Coordonées de la souris dans le monde
        mousePos = (sf::Vector2i)GD->m_window.mapPixelToCoords(mousePos);

        float newAngle = atan2f(mousePos.y - m_pos.y, mousePos.x - m_pos.x) * 180 / PI;

        float theta = newAngle - m_angle;

        if (abs(theta) < 180)
        {
                m_angle += theta / 10.0f;
        }
        else
        {
                if (theta > 0)
                {
                        m_angle -= (360 - abs(theta)) / 10.0f;
                }
                else
                {
                        m_angle += (360 - abs(theta)) / 10.0f;
                }

                if (m_angle > 180)
                {
                        m_angle = -180 + (m_angle - 180);
                }
                else if (m_angle < -180)
                {
                        m_angle = 180 + (m_angle + 180);
                }
        }

        m_hitbox.setRotation(m_angle);
}