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
et end
marquez les points finaux du mouvement, speed
est le nombre de pixels qu'il doit déplacer par seconde, et elapsed
est la vitesse à laquelle vous mettrez à jour la position de votre objet (certains moteurs fournissent déjà cette valeur pour vous ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
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:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Ensuite , sur votre méthode de mise à jour, vous déplacez l'objet en ajoutant une multiplication direction
, speed
et elapsed
à 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:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Référence des opérations vectorielles rapides
Représentation
Vector2 A = float aX, aY;
Somme / soustraire
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Multiplier par Scalar (float)
A*float = a.x*float; a.y*float;
Longueur / distance
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normaliser
normalize(A) = a.X/length(A); a.Y/length(A);
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
// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;
// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;
// On update
if(moving == true)
{
object.X += directionX * speed * elapsed;
object.Y += directionY * speed * elapsed;
if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
{
object.X = endX;
object.Y = endY;
moving = false;
}
}