Почему спрайт дергается? - PullRequest
1 голос
/ 15 мая 2019

Написал функцию, которая вычисляет координаты спрайта, который движется по кругу. Ну, формула элементарная

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 () В итоге все работает, но спрайт как-то нервно дергается. Вот видео, которое демонстрирует это.

видео

Следующее содержимое отправляется в дельта-переменную.

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

Я не могу понять причину

1 Ответ

3 голосов
/ 15 мая 2019

Вы должны увеличить 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 * delta, которое вы используете в качестве параметра Math.sin() и Math.cos(), уменьшилось во второй итерации, вызывая дрожание вашего значка.

Чтобы обеспечить согласованность анимации, важно убедиться, что параметр, передаваемый этим двум функциям (Math.sin() и Math.cos()), увеличивается только с каждой итерацией!

...