Delta-time滞后补偿让我的Spinner陷入了困境

时间:2014-05-03 03:03:11

标签: java libgdx lag delta

在我的游戏中,我有一个spinner,就像在马里奥那样。

当游戏没有滞后时,微调器完美运行并以恒定速度旋转360度。

然而,当它落后时(Android版本会发生很多),gaps start appearing between the different projectiles and it doesn't even rotate in a circle anymore, it just rotates in a distorted elliptical pattern

这是Spinner的Java代码

         helper += speedVariable * 1f;
         speedY = (float) (speedVariable *helper2 * Math.cos(Math.toRadians(helper)));
         speedX = (float) (speedVariable * -1 * helper2 * Math.sin(Math.toRadians(helper)));


    setX(getX() + (speedX * delta) + ((Background.bg.getSpeedX() * 5) * delta));
    setY(getY() + (speedY * delta));

float helper是使余旋钮旋转的余弦和正弦函数内的字段

speedVariable控制转速

helper2设置旋转的半径

我做错了吗?谢谢!

1 个答案:

答案 0 :(得分:3)

不要设置相对于前一个位置的新位置。你想留在中心点周围的圆圈,所以从这一点可靠地计算位置要容易得多:

setX(getCenterX() + xFromCenter + (Background.bg.getSpeedX() * 5));
setY(getCenterY() + yFromCenter);

(我不确定背景部分是什么,我只是假设它应该被保留。)

xFromCenteryFromCenter是旋转的余弦和正弦。在原始代码中,您在helper中进行了轮换,所以让我们保持这样。但是你应该将delta应用于它的增量,因为你想在相同的秒数内旋转相同的度数。

helper += speedVariable * delta;

这样想:三角洲应该直接影响它旋转的程度,而不是它在x和y轴上移动的程度(因为这些值不会随时间线性变化)。

然后你可以xFromCenter得到speedX,除了现在不需要速度,并为Y做同样的事情。虽然我设置了X由cos和Y由sin,而不是相反 - 这是典型的用法,角度从右侧0开始测量。 (差异只是旋转90度。)

另外,一个小问题:您可以在计算时使用MathUtils.sinDeg()cosDeg()函数,因此您不需要转换为弧度并将结果转换回浮点数。它更具可读性。

整个代码:

helper += speedVariable * delta;
xFromCenter = helper2 * MathUtils.cosDeg(helper));
yFromCenter = -1 * helper2 * MathUtils.sinDeg(helper));

setX(getCenterX() + xFromCenter + (Background.bg.getSpeedX() * 5));
setY(getCenterY() + yFromCenter);

您可能需要使用常量(helper2,speedVariable,-1 multiplication)并可能撤消X和Y的交换以获得您想要的内容,但这应该在所有条件下将对象保持在圆上。