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

Auteur Sujet: SFML s'orienter vers un point ou sprite ou souris  (Lu 3666 fois)

0 Membres et 1 Invité sur ce sujet

omegadil

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
SFML s'orienter vers un point ou sprite ou souris
« le: Juillet 21, 2021, 08:33:06 am »
bonjour/bonsoir

je suis novice en c++ et je cherche à orienter un Sprite de sfml 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

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #1 le: Juillet 21, 2021, 05:04:35 pm »
Oui tu dois la créer.
Tu peux utiliser la fonction atan2 de C++ pour calculer l'angle dans lequel orienter le sprite, un truc du style
float angle = atan2(souris.y - sprite.y, souris.x - sprite.x)
Ça te donne l'angle en radians, tu le convertis en degrés car SFML utilise des degrés puis tu fais tourner ton sprite avec setRotation.
Note que le sprite tourne autour de son origin, qui de base est dans le coin haut gauche du sprite. Donc si tu préfères que le sprite tourne autour de son centre, faudra changer l'origin pour le centre avec setOrigin

omegadil

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #2 le: Juillet 22, 2021, 09:03:45 am »
j'ai fait ce code le seul probleme est que le sprite tourne sur lui meme (l'origine est bien dans son centre)
   
   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
   
   int angle_rad = atan2(y, x);//calcule de l'angle
   int angle_deg = angle_rad * 180 / 3.14159265358979323846;//convertir en degres
   rotate(angle_deg);//tourner
   //mais mon sprite tourne sur lui meme

voila c'est le contenu d'une fonction qui est appelé dans la boucle while(window.isOpen). Je voudrais que mon sprite s'oriente en temps réel vers ma souris

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #3 le: Juillet 22, 2021, 11:14:21 am »
Faut utiliser setRotation, rotate ça ajoute une rotation.

Mais du coup je suis pas sûr de ce que tu veux dire. Quand tu dis orienter vers, tu veux en fait dire se déplacer vers ? 🤔
Parce que orienter ça veut juste dire se tourner dans une direction

omegadil

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #4 le: Juillet 22, 2021, 11:43:39 am »
se tourner vers

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #5 le: Juillet 22, 2021, 12:19:05 pm »
Bah du coup avec setRotation ça devrait fonctionner. Et utiliser les float plutôt que des int pour tes angles sinon ça casse tout

omegadil

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re: SFML s'orienter vers un point ou sprite ou souris
« Réponse #6 le: Juillet 23, 2021, 10:26:00 am »
ça marche :) !!! je n'arrivais pas à le faire tourner progressivement avec setRotation donc je suis retourné à rotate et j'ai trouvé une solution :

   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 marcher 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.
merci G. Sujet Resolu (d'ailleur comment je fais pour le mettre en resolu)
« Modifié: Juillet 23, 2021, 10:28:57 am par omegadil »