为什么要抽搐呢?

时间:2019-05-15 13:07:38

标签: java libgdx

编写了一个函数,该函数计算在圆周中移动的精灵的坐标。 好,公式很简单

x = x0 + R * cos(t * a + a0)

y = y0 + R * sin(t * a + a0)

函数看起来像这样

    public void pointDefinition(float delta)
  {
    sprite.setPosition(Gdx.graphics.getWidth()/2+(85*(float)Math.cos(i*delta)), Gdx.graphics.getHeight()/2+(85*(float)Math.sin(i*delta)));
    i = i + 0.5;
  }

我在render()中称它为 最后,一切正常,但是精灵以某种方式紧张地抽动着。 这是一个演示这个的视频。

video

以下内容将发送到delta变量。

pointDefinition(Math.min(Gdx.graphics.getDeltaTime(), 1 / 60f));

我不明白原因

1 个答案:

答案 0 :(得分:3)

您应将i增加delta,而不是在公式中使用delta作为参数:

public void pointDefinition(float delta)
{
    sprite.setPosition((Gdx.graphics.getWidth() / 2) + (85 * (float)Math.cos(i)), (Gdx.graphics.getHeight() / 2) + (85 * (float)Math.sin(i)));
    i = i + delta;
}

毕竟,delta每次都有不同的值,这就是有时使小图标向后移动的原因。

要了解发生了什么,请想象一下这两个迭代:

第一次迭代

  1. i = 2
  2. delta = 0.0025

在这种情况下,i * delta将为 0.005

第二次迭代

  1. i = 2.5
  2. delta = 0.0017

在这种情况下,i * delta将为 0.00425

如您所见,在第二次迭代中,用作参数i * deltaMath.sin()的{​​{1}}的值减小了,从而导致图标抖动。 / p>

为使动画保持一致,确保传递给这两个函数的参数(Math.cos()Math.sin()仅在每次迭代中增加是很重要的!