Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML s'orienter vers un point ou sprite ou souris

Sujet résolu
    20 juillet 2021 à 21:04:44

    bonjour/bonsoir

    je suis novice en c++ et je cherche à orienter un Sprite vers la souris/un point. je n'ai pas trouver de fonction du genre : sprite1.orienterVersUnSprite(sprite2) ou autre sur google alors je suppose qu'il faudra que je l'a creer

    merci de votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2021 à 10:54:13

      Salut,

      En supposant qu'il n'y ai pas d'obstacles à contourner, le plus simple c'est de :

      - Calculer l'angle entre entre ta souris et ton sprite

      - Et de faire avancer ton sprite en

        x += cos(angle)

        y += sin(angle)

      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2021 à 11:28:50

        que veut-tu dire par "Calculer l'angle entre ta souris et ton sprite"

        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2021 à 12:28:58

          L'angle qu'on cherche entre un sprite et la souris ou autre c'est a. En connaissant x et y, on peut le calculer en faisant a = atan2(y, x).

          Et x c'est la distance horizontale entre le sprite et la souris, donc (souris.x - sprite.x) et y c'est (souris.y - sprite.y).

          Une fois qu'on a l'angle il suffit de faire tourner le sprite avec cet angle, avec SFML il suffit de faire sprite.rotate(angle)

          Attention avec SFML l'angle doit être en degrés mais atan2 renvoie un angle en radians, il faut le convertir : angle_deg = angle_rad * 180 / PI

          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2021 à 15:52:21

            	Vector2f spritePos = getPosition();
            	Vector2i mousePos = Mouse::getPosition();
            	float x = mousePos.x - spritePos.x;
            	float y = mousePos.y - spritePos.y;
            	
            	int angle_rad = atan2(y, x);
            	int angle_deg = angle_rad * 180 / 3.14159265358979323846;
            	
            	rotate(angle_deg);
            c'est le contenu de la fonction que j'ai fait mais le probleme c'est que mon sprite tourne sur lui meme, et s'arrete de tourner quand je met ma souris dans une certaine position et recommence à tourner si je bouge ma souris
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2021 à 17:08:46

              rotate est cumulatif.

              Vous devez faire tourner votre sprite de la différence entre l'orientation actuelle et l'orientation cible.

              -
              Edité par bacelar 21 juillet 2021 à 17:08:59

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                22 juillet 2021 à 8:31:55

                bacelar a écrit:

                rotate est cumulatif.

                oui je sais que rotate est cumulatif

                bacelar a écrit:

                Vous devez faire tourner votre sprite de la différence entre l'orientation actuelle et l'orientation cible.

                c'est ce que fait ce code, nan ?

                je crois que j'ai oublie de préciser que cette fonction est dans un while (le while(isOpen) de sfml). En faite je veux que ce sprite s'oriente en temps réel vers la souris



                -
                Edité par omegaDIL 22 juillet 2021 à 8:33:34

                • Partager sur Facebook
                • Partager sur Twitter
                  22 juillet 2021 à 9:35:26

                  Oui j’avais oublié que le rotate est cumulatif. C’est à dire qu’une fois qu’on l’a fait rotate la première fois, il ne faut plus le faire rotate de l’angle complet puisqu’il a déjà tourné précédemment. en fait il faut le faire rotate de l’angle calculé moins l’angle actuel (getRotation())
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 juillet 2021 à 11:41:01

                    merci JadeSalina, bacelar et Toniooo ça marche mais ce n'est pas tres fluid car le sprite tourne d'un seul coup, si il pouvait tourner progressivement ça serait mieux, j'ai essayer avec une boucle for comme ça :

                    for (int c(0); c < (angle_deg - getRotation()); c++)
                    {
                         rotate(1);
                    }

                    mais je ne comprend pas pourquoi ça ne marche que pendant la premiere second. Et apres cette second, il ne tourne plus du tout

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juillet 2021 à 12:16:12

                      Pour qu'il tourne progressivement, il faut séparer la notion d'angle "actuel" et d'angle "cible". Quand on veut changer l'angle, on change l'angle "cible" et à chaque image on modifie l'angle "actuel" pour qu'il tende vers l'angle cible, par exemple 
                      angle_courant += 0.1 * (angle_cible - angle_courant);
                      Et pas besoin de définir un angle courant, on peut utiliser celui que renvoie SFML avec getRotation(). Le "0.1" c'est la vitesse à laquelle l'angle change, entre 0 et 1. Plus c'est proche de 0, plus l'angle mettra du temps à atteindre l'angle cible
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 juillet 2021 à 16:13:48

                        voici le code mis à jour (au cas où vous en aurez besoin):

                        	Vector2f spritePos = getPosition();//je recupere la position du sprite
                        	Vector2i mousePos = Mouse::getPosition();//je recupere la position de la souris
                        	float x = mousePos.x - spritePos.x;//je calcule la distance en x
                        	float y = mousePos.y - spritePos.y;//je calcule la distance en y
                        	
                        	float angle_rad = atan2(y, x);//calcule de l'angle
                        	float angle_deg = angle_rad * 180 / 3.14159265358979323846;//convertir en degres
                        
                        	setRotation(getRotation() + 0.1 * (angle_deg - getRotation()));//s'orienter

                        mon sprite s'oriente bien quand la souris est en dessous de son origine (il s'oriente progressivement en plus). Mais quand ma souris est au dessus de l' origine de mon sprite, il se met à tourner sur lui meme.

                        petit shema :

                        -
                        Edité par omegaDIL 23 juillet 2021 à 9:37:10

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 juillet 2021 à 16:27:42

                          ça marche:) !!! comme le sprite ne s'orienter que quand la souris etait en haut, j'ai fais quelque modification mais ça ne marchait toujours pas. Donc j'ai pris un ancien code (celui-la) :

                          Vector2f spritePos = getPosition();
                          Vector2i mousePos = Mouse::getPosition();
                          float x = mousePos.x - spritePos.x;
                          float y = mousePos.y - spritePos.y;
                           
                          int angle_rad = atan2(y, x);
                          int angle_deg = angle_rad * 180 / 3.14159265358979323846;
                           
                          rotate(angle_deg);

                          et je l'ai modifie en :

                          	Vector2f spritePos = getPosition();//je recupere la position du sprite
                          	Vector2i mousePos = Mouse::getPosition();//je recupere la position de la souris
                          	float x = mousePos.x - spritePos.x;//je calcule la distance en x
                          	float y = mousePos.y - spritePos.y;//je calcule la distance en y
                          	
                          	float angle_rad = atan2(y, x);//calcule de l'angle
                          	float angle_deg = angle_rad * 180 / 3.14159265358979323846;//convertir en degres
                          	double tourner = (angle_deg - getRotation()) / 10;//diviser par 10 pour mieux tourner progressivement
                          	for (int c(0); c < 10; c++)
                          	{
                          		rotate(tourner);//tourner
                          	}

                          ça marchait aussi sans le "for" et le "/10" mais quelque fois il tourner d'un coup donc je divise par 10 pour qu'il tourne mieux.

                          En tout cas merci JadSalina, je me demande si un jour j'aurais un 1/10 de ton niveau

                          sujet Resolu :D

                          -
                          Edité par omegaDIL 23 juillet 2021 à 16:34:27

                          • Partager sur Facebook
                          • Partager sur Twitter

                          SFML s'orienter vers un point ou sprite ou souris

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          • Editeur
                          • Markdown