1

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

显然我可以这样做:

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

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

我真的不知道如何创建这样的算法,以允许两点之间的平滑移动(分类我不知道如何计算我应该添加什么值到

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

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

4

2 回答 2

6

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

因此,它应该在任何给定更新中移动的量是total/120.

您可以将其抽象为一个方法,该方法对移动进行排队,计算 FPS 和每次更新的移动量,并调用.setCenter其当前位置和更新量。这通常称为插值。要确定你需要移动多远,它的绝对值不超过current - destination(哪个在另一个前面并不重要,所以我们只取绝对值忽略符号。从技术上讲,距离是一个标量,而位置是向量)。

因此,总结为半代码(我不知道这些功能的实际合同):

//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)

然后,您只需要跟踪何时停止,就可以开始了。

我不知道您是否正在使用已经具备执行此功能的引擎。但就纯粹的算法而言,这似乎是要走的路。

于 2012-08-13T18:40:24.157 回答
0

请参阅此问题的讨论

从答案:

长度=平方根((bx - ax)^2+(by - ay)^2)

速度X = (bx - ax) / 长度 * 速度

速度Y = (by - ay) / 长度 * 速度

其中xValue 是velocityX 和Y 类似

于 2012-08-13T18:41:36.777 回答