我将使用一些线性代数结构,因为这样更容易描述操作。如果您不知道如何实现这些矢量操作,我将在最后给出快速解释。
因此,假设您从这些值开始:start
并end
标记运动的终点,speed
它是每秒应移动多少像素,以及elapsed
更新对象位置的速率(某些引擎已经为您提供了该值):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
您要计算的第一件事是两点之间的距离,以及包含从开始到结束的方向的归一化向量。另外,您应该将对象位置“捕捉”到该start
点。在开始时,此步骤仅执行一次:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
然后,您的更新方法,可以通过添加的乘法移动对象direction
,speed
并elapsed
给它的位置。之后,要检查移动是否结束,请查看起点和对象当前位置之间的距离是否大于您计算出的初始距离。如果是这样,我们将对象的位置捕捉到终点,然后停止移动该对象:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
快速向量运算参考
表示
Vector2 A = float aX, aY;
加/减
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
乘以标量(浮点)
A*float = a.x*float; a.y*float;
长度/距离
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
归一化
normalize(A) = a.X/length(A); a.Y/length(A);
如果您没有Vector
可用的类,则足以将上述代码转换为常规操作。
转换示例
// 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;
}
}