java - 平稳地从 A 移动到 B

标签 java android algorithm math

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

显然我可以这样做:

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

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

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

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

因为必须根据这两点之间的距离来计算这些值。

最佳答案

如果您的游戏以每秒 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)

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

我不知道您使用的引擎是否已经具备执行此功能的能力。但就纯算法而言,这似乎是可行的方法。

关于java - 平稳地从 A 移动到 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940282/

相关文章:

Java 1.7 似乎以与其他 Java 版本不同的方式显示 jPanel

android - 在 Windows 上插入 android usb 时中断

iphone - 生成哈希谜题

javascript - 搜索算法

c++ - 从类函数更改 int 值

java - JPanel 未在 JFrame 中加载

c# - 什么时候使用公共(public)字段才有意义?

java - 使用 Java POST 请求在 Django Tastypie 上创建资源,但收到 500 错误代码

android - 使用 AndEngine 和 Box2D 制作英雄跳跃

android - 如何获取光传感器的具体值