【问题标题】:Smooth moving from A to B从 A 到 B 平滑移动
【发布时间】:2012-08-13 18:35:43
【问题描述】:

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

显然我可以这样做:

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

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

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

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

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

【问题讨论】:

    标签: java android algorithm math


    【解决方案1】:

    如果您的游戏以每秒 60 帧的速度更新,并且您希望转换需要 2 秒,那么它应该需要 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)
    

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

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

    【讨论】:

      【解决方案2】:

      查看this question的讨论

      来自答案:

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

      velocityX = (b.x - a.x) / 长度 * 速度

      velocityY = (b.y - a.y) / 长度 * 速度

      xValue 是velocityX 和Y 类似

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 2019-10-29
        • 1970-01-01
        • 2012-06-17
        • 2016-08-10
        相关资源
        最近更新 更多