J'ai actuellement quelque chose comme:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
Et toutes les 0,01 secondes, je rafraîchis la position de mes objets comme ceci:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
Cela déplace donc mon objet du point0 au point1 en 1 seconde. Ce dont j'ai besoin, c'est d'avoir les 2 points, pour pouvoir déplacer l'objet du point0, face (dans la direction de) point1 avec une vitesse constante. Ainsi, quand j'ai un point plus proche de mon point initial, l'objet se déplacera vers lui avec la même vitesse que si j'avais un point plus éloigné. Toutes les suggestions sont appréciées. Merci.
game-mechanics
movement
Fofole
la source
la source
Réponses:
Je vais utiliser des structures d'algèbre linéaire car il est plus facile de décrire les opérations de cette façon. Dans le cas où vous ne savez pas comment implémenter ces opérations vectorielles, je donnerai une explication rapide à la fin.
Disons donc que vous commencez par ces valeurs:
start
etend
marquez les points finaux du mouvement,speed
est le nombre de pixels qu'il doit déplacer par seconde, etelapsed
est la vitesse à laquelle vous mettrez à jour la position de votre objet (certains moteurs fournissent déjà cette valeur pour vous ):La première chose que vous voudrez calculer est la distance entre les deux points et un vecteur normalisé contenant la direction du début à la fin. En outre, vous devez "accrocher" la position de l'objet au
start
point. Cette étape n'est effectuée qu'une seule fois, au début:Ensuite , sur votre méthode de mise à jour, vous déplacez l'objet en ajoutant une multiplication
direction
,speed
etelapsed
à sa position. Après cela, pour vérifier si le mouvement est terminé, vous voyez si la distance entre le point de départ et la position actuelle de l'objet est supérieure à la distance initiale que vous avez calculée. Si c'est vrai, nous alignons la position de l'objet sur le point final et arrêtons de déplacer l'objet:Référence des opérations vectorielles rapides
Représentation
Somme / soustraire
Multiplier par Scalar (float)
Longueur / distance
Normaliser
Cela devrait être suffisant pour convertir le code ci-dessus en opérations régulières si vous n'avez pas de
Vector
classe à votre disposition.Exemple de conversion
la source
Vector2 start;
devientfloat startX, startY;
. Et vous pouvez facilement calculer la distance manuellement, comme je l'explique à la fin. C'est à direfloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Créez un vecteur et normalisez-le. Attention, certains pseudo-code avec de mauvais numéros à venir:
Cela vous donnera un vecteur comme:
Normalisez maintenant le vecteur et vous recevrez ceci :
De là, c'est le même mouvement qu'avec votre delta.
la source
Copié et collé de ma réponse à: Obtenir des points sur une ligne entre deux points
En pseudocode:
la source