我有一个安卓游戏,我不时将相机(可见屏幕部分)从A点移动到B点。
显然我可以这样做:
camera.setCenter(B.getX(), B.getY();
但它看起来不太好,它只是立即跳转,我想要实现的是从A到B的平滑移动。我可以访问onUpdate方法,它是循环更新某些游戏对象(所以我可以执行某些事情)毫秒)
我真的无法弄清楚如何创建这样的算法,允许两点之间的平滑移动(分类我不知道如何计算我应该添加到哪个值
camera.setCenter(camera.getX() + xValue, camera.getY() + yValue)
因为必须计算这些值取决于这两点之间的距离。
答案 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)
答案:
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