为什么精灵抽搐?

Why sprite twitches?

写了一个函数来计算一个圆周运动的精灵的坐标。 嗯,公式很初级

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));

无法理解原因

您应该使用 delta 递增 i 而不是使用 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

如您所见,您用作 Math.sin()Math.cos() 参数的 i * delta 的值在第二次迭代中减小,导致您的图标抖动.

为了保持动画的一致性,重要的是要确保传递给这两个函数(Math.sin()Math.cos())的参数只随着每次迭代而增加!