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
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
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
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())
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
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
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
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.
ç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
- Edité par omegaDIL 23 juillet 2021 à 16:34:27
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é.
× 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.
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
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