Java Delta时滞补偿打乱了我的旋转器

Java Delta时滞补偿打乱了我的旋转器,java,libgdx,lag,delta,Java,Libgdx,Lag,Delta,在我的游戏里,我有一个,就像《马里奥》中的那些 当游戏没有延迟时,旋转器功能完美,以恒定速度旋转360度 然而,当它滞后时(Android版本经常发生这种情况) 这是我的微调器Java代码 helper += speedVariable * 1f; speedY = (float) (speedVariable *helper2 * Math.cos(Math.toRadians(helper))); speedX = (float) (sp

在我的游戏里,我有一个,就像《马里奥》中的那些

当游戏没有延迟时,旋转器功能完美,以恒定速度旋转360度

然而,当它滞后时(Android版本经常发生这种情况)

这是我的微调器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设置其旋转的半径


我做错什么了吗?谢谢

不要相对于上一个位置设置新位置。您希望停留在围绕中心点的圆上,因此从该点可靠地计算位置要容易得多:

setX(getCenterX() + xFromCenter + (Background.bg.getSpeedX() * 5));
setY(getCenterY() + yFromCenter);
(我不确定背景部分是关于什么的,我只是认为应该保留它。)

xFromCenter
yFromCenter
是旋转的余弦和正弦。在原始代码中,您在
helper
中进行了旋转,所以让我们保持这样。但是您应该对其增量应用
delta
,因为您希望在相同的秒数内旋转相同的度数

helper += speedVariable * delta;
可以这样想:增量应该直接影响它的旋转程度,而不是它在x轴和y轴上移动的程度(因为这些值不会随时间线性变化)

然后你可以像你得到的那样得到
xFromCenter
,除了现在不需要速度,然后对Y做同样的操作。虽然我已经用cos设置了X,用sin设置了Y,而不是相反的方式-这是典型的用法,角度从右侧的0开始测量。(差别只是旋转90度。)

还有一件小事:计算时可以使用
MathUtils.sinDeg()
cosDeg()
函数,因此不需要转换为弧度并将结果转换回float。它更具可读性

整个代码:

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乘法)并可能撤消X和Y的交换,以获得您想要的结果,但这将使对象在任何情况下都保持在一个圆上。

非常感谢!使用您的建议后,它工作得非常好!