Il s'agit probablement d'une simple question vectorielle, mais je ne sais pas comment le faire.
J'ai un objet en position vectorielle (ox,oy)
. Potentiellement à chaque mise à jour, l'utilisateur parcourt l'écran et sera en position (px,py)
à tout moment. Comment faire en sorte que l'objet soit toujours face au joueur? J'ai besoin d'obtenir l'angle en degrés.
C'est ce avec quoi je me suis amusé, mais la direction ne pointe pas immédiatement vers où se trouve l'utilisateur. Au lieu de cela, il augmente lentement dans la direction dans laquelle l'utilisateur marche.
objVec.Normalize();
playerVec.Normalize();
obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));
Je me trompe peut-être complètement, donc toute aide est appréciée!
Réponses:
Pensez différemment au problème. Vous voulez toujours vous opposer à "faire face" au joueur, ce qui signifie que vous voulez que son vecteur "avant" tourne autour pour être parallèle au vecteur de lui-même au joueur. En supposant que son vecteur "avant" est normalement à
obj.Rotation = 0
, la rotation appropriée est fondamentalement l'arctangente deVector2.Subtract(playerPos, objectPos)
. La plupart des bibliothèques mathématiques auront quelque chose commeatan2
ça qui prend deux arguments ou unVector2
qui trouvera automatiquement le bon quadrant pour vous.EDIT: J'ai réalisé que vous êtes en C # et ce sont en fait des classes intégrées. Vous n'avez donc pas à aller chercher la documentation de la bibliothèque de mathématiques, je peux le faire pour vous. Le bon code doit être:
Notez l'inversion X / Y; pour les raisins secs hystériques, Atan2 a toujours les arguments inversés.
la source