J'ai dans mon jeu des objets qui se déplacent plus rapidement à 45 degrés puis à 90 degrés.
Chaque objet a
- Point (x, y) position
- Direction Vector2D (x, y)
- Vitesse int
Et ce que je fais lors d’une mise à jour, c’est que le nouveau poste est calculé comme suit:
position.x += direction.x * speed
position.y += direction.y * speed
Comment puis-je corriger cela? Je veux qu'il se déplace avec la même vitesse sous n'importe quel angle.
Réponses:
Ceci peut être expliqué avec le théorème de Pythagore , qui est la formule suivante:
Dans votre cas, lorsque vous vous déplacez à droite, vous utilisez (x: 1, y: 0) ce qui nous donne
En montant et à droite, vous utilisez (x: 1, y: 1) ce qui nous donne
Comme vous pouvez le constater, la longueur en diagonale est supérieure à celle des axes cardinaux.
Comme d'autres l'ont mentionné, vous devriez simplement normaliser votre vecteur de direction. Si vous utilisez XNA, c'est comme ça:
la source
Normalisez votre vecteur de direction avant utilisation.
Comme expliqué par MindWorX, ceci peut être simplement compris. Si vous vous inquiétez de ce que vos vecteurs de direction peuvent vous causer du chagrin, assurez-vous qu’ils sont des vecteurs unitaires (magnitude / longueur de 1).
Si normalisé:
la source
Comment calculez-vous votre direction? Si 45 degrés est
(1,1)
, alors il va certainement être plus rapide que 90 degrés(1,0)
.Je vous suggère d'utiliser quelque chose comme ceci:
Pour obtenir l'angle en radians, vous devrez multiplier vos degrés avec
PI / 180
ou même mieux, utilisezMathHelper
. Par exemple.la source
Jason
Plutôt que d'avoir trois attributs d'objet,
Il est souvent beaucoup plus facile de combiner la direction et la vitesse dans un vecteur vitesse. Ensuite, vous avez seulement deux attributs,
Mise à jour de la position
Lorsque vous devez mettre à jour la position de l'objet, procédez comme suit:
où
Δt
est votre delta temporel - ou différence de temps - ou pas de temps.Mise à jour de la position et de la vitesse
Il est également très facile de gérer l’accélération (par exemple, par gravité). Si vous avez un vecteur d'accélération, vous pouvez mettre à jour la vitesse et la position ensemble comme ceci:
(Ceci est essentiellement la formule s = vt + ½at² de Physics 101.)
Appliquer une vitesse
Si vous souhaitez appliquer une vitesse donnée dans une direction normalisée, vous pouvez définir la vitesse comme suit:
Dériver une vitesse
Et si vous devez faire l'inverse - en déduisant la vitesse et la direction d'un vecteur de vitesse donné - vous pouvez simplement utiliser le théorème de Pythagore ou la
.Length()
méthode:Et une fois que la vitesse est connue, la direction normalisée peut être calculée en divisant la vitesse par la vitesse (en évitant de diviser par zéro):
la source