2012-08-13 28 views
1

我有时间移动摄像机(屏幕可视部分)的Android游戏,我必须不时从A点到B点平稳移动到B

显然,我可以做到这样的:

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

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

我真的无法弄清楚如何cre吃了这样的算法,允许两个点之间的平滑运动(判断我不知道如何计算我要补充到

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

什么值,因为必须计算的值取决于什么是这两个点之间的距离。

回答

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) 

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

不管你是否使用已经具备这种功能的引擎,我不知道。但就纯算法而言,这似乎是一条路。

+0

谢谢你很好的解释,现在我明白了。 – Matim 2012-08-13 19:11:28

0

查看来自this question

讨论从答案:

长度= square_root((BX - 斧)^ 2 +(由 - AY)^ 2)

velocityX =( BX - 斧)/长度*速度

velocityY =(由 - AY)/长度*速度

其中x值是velocityX y与此类似