Bonjour,
je suis en train de mettre au point un peu truc avec la SFML mais je bute actuellement sur un petit problème...
J'essaye de faire pivoter un objet dans la direction de la souris.
sf::Vector2i pos = sf::Mouse::getPosition(window);
float diffx = fabs(pos.x - player.getOrigin().x);
float diffy = fabs(pos.y - player.getOrigin().y);
if(diffy == 0)
diffy = 0,001; //0 est une valeur interdite !
float angle = atan(diffx/diffy) * 180 / PI; //#define PI 3.14159265
if(pos.x > player.getOrigin().x && pos.y < player.getOrigin().y)
player.setRotation(angle);
else if(pos.x > player.getOrigin().x && pos.y > player.getOrigin().y)
player.setRotation(90 + angle);
else if(pos.x < player.getOrigin().x && pos.y > player.getOrigin().y)
player.setRotation(180 + angle);
else if(pos.x < player.getOrigin().x && pos.y < player.getOrigin().y)
player.setRotation(360-angle);
Voilà, mais cet algorithme ne marche pas... pourtant je n'arrive pas à comprendre...
Les angles obtenus via atan sont en radian, je les passe donc en degré (ce qui est attendu par SFML)
Je pense avoir pensé à tout, à la valeur interdite pour la division, j'ai même fait des dessins, je vois pas le problème... Mais l'orientation de mon objet reste incohérente....
Merci d'avance :)
Y a pas mal d'erreurs dans ton code :
- il faut utiliser la position de l'entité, pas son origine
- il faut transformer la position de la souris ; même si tu n'as pas de vue perso, c'est une bonne habitude à prendre
- il ne faut jamais utiliser std::atan, mais plutôt sa variante std::atan2
sf::Vector2i cursor = sf::Mouse::getPosition(window);
sf::Vector2f diff = window.mapPixelToCoords(cursor) - player.getPosition();
float angle = std::atan2(diff.y, diff.x) * 180 / PI;
player.setRotation(angle);
Il faudra peut-être inverser l'angle ou bien diff.y, mais sinon ça devrait le faire.