平滑从A移动到B.

时间:2012-08-13 18:35:43

标签: java android algorithm math

我有一个安卓游戏,我不时将相机(可见屏幕部分)从A点移动到B点。

显然我可以这样做:

camera.setCenter(B.getX(), B.getY();

但它看起来不太好,它只是立即跳转,我想要实现的是从A到B的平滑移动。我可以访问onUpdate方法,它是循环更新某些游戏对象(所以我可以执行某些事情)毫秒)

我真的无法弄清楚如何创建这样的算法,允许两点之间的平滑移动(分类我不知道如何计算我应该添加到哪个值

camera.setCenter(camera.getX() + xValue, camera.getY() + yValue)

因为必须计算这些值取决于这两点之间的距离。

2 个答案:

答案 0 :(得分:6)

如果您的游戏以每秒60帧的速度更新,并且您希望转换需要两秒钟,那么它应该需要120帧才能到达。

因此,任何给定更新中应移动的金额为total/120

您可以将此抽象为一种方法,该方法对移动进行排队,计算FPS以及移动每次更新的金额,并在其当前位置和更新金额上调用.setCenter。这通常称为interpolation。要确定你需要移动多远,它不超过current - destination的绝对值(哪一个在另一个之前无关紧要,所以我们只取绝对值来忽略符号。技术,distance is a scalar whereas position is a vector)。

所以,总结一下半代码(我不知道这些函数的实际合约):

//given these variables already have value
double fps, currentX, destinationX, currentY, destinationY, animationLength; //animation length in seconds
...
double xValue = Math.abs(currentX - destinationX);
double yValue = Math.abs(currentY - destinationY);
...
//on each update:
double amountToMoveX = xValue / (animationLength * fps);
double amountToMoveY = yValue / (animationLength * fps);
camera.setCenter(camera.getX() + amountToMoveX, camera.getY() + amountToMoveY)

然后你只需要跟踪何时停止,你应该好好去。

你是否正在使用已经有这种方法的引擎,我不知道。但就纯算法而言,这似乎是要走的路。

答案 1 :(得分:0)

请参阅this question

中的讨论

答案:

  

length = square_root((b.x - a.x)^ 2 +(b.y - a.y)^ 2)

     

velocityX =(b.x - a.x)/ length * speed

     

velocityY =(b.y - a.y)/ length * speed

其中xValue是velocityX,类似于Y