2

在我的游戏中,我有一个微调器,就像马里奥中的一样。

当游戏没有滞后时,微调器功能完美,并以恒定速度在整个 360 度圆周内旋转。

然而,当它滞后时(这在 Android 版本中经常发生),不同的弹丸之间开始出现间隙,它甚至不再绕圈旋转,它只是以扭曲的椭圆图案旋转

这是我的 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 是 cosine 和 sine 函数内部的字段,使微调器旋转

speedVariable 控制旋转速度

helper2 设置它旋转的半径

我做错什么了吗?谢谢!

4

1 回答 1

3

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

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

(我不确定背景部分是关于什么的,我只是认为应该保留它。)

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

helper += speedVariable * delta;

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

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

还有一个小问题:你可以在计算时使用MathUtils.sinDeg()andcosDeg()函数,所以你不需要转换为弧度并将结果转换回浮点数。它更具可读性。

整个代码:

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 的交换以获得您想要的结果,但这应该使对象在所有条件下都保持在一个圆圈上。

于 2014-05-03T14:41:43.077 回答