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: startet endmarquez les points finaux du mouvement, speedest le nombre de pixels qu'il doit déplacer par seconde, et elapsedest 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 startpoint. 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, speedet 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 Vectorclasse à 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;
}
}