Частотное независимое ускорение - PullRequest
1 голос
/ 10 марта 2011

Итак, я понимаю, что для получения независимого от частоты кадров движения мне нужно умножить базовую скорость на (1000 / дельта).Он работает со значениями, которые представляют скорость, но когда я пытаюсь сделать это с переменной ускорения, например, гравитацией, это не сработает, даже не зависит от частоты кадров.

Существует ли другая формула для переменных ускорения, или я что-то забываю?

Пример:

var Multiplier:Number = (GetDeltaTime()) / (1000 / 30);
jumpVelocity = -21 * Multiplier //works
gravity = 1.5 * Multiplier //dosn't work

Это вызывается в начале каждого кадра

Редактировать : нашел решение, мне пришлось вычислить квадрат времени дельты.Не уверен на 100%, почему это работает, но работает.

Итак:

jumpVelocity = -21 * Multiplier //unchanged
gravity = 1.5 * Math.pow(Multiplier,2) //works now

1 Ответ

2 голосов
/ 10 марта 2011

По сути, вы хотите измерить время, прошедшее с последнего кадра («время кадра»), и добавить его к аккумулятору.

Затем вы пересылаете состояние своей игры с помощью «фиксированных временных шагов» (например, 1/30 секунды) и вычитаете это имитированное время из аккумулятора, пока оно не станет меньше одного временного шага.

Так в качестве примера:

  • аккумулятор начинается с 0
  • фиксированный шаг по времени, установленный на 33 мс

  • 1 кадр проходит при 20 кадрах в секунду, время кадра было 1000 мс / 20 = 50 мс

  • 50мс добавлено в аккумулятор
  • игровое состояние передается за 1 фиксированный временной шаг (33 мс), это время вычитается из аккумулятора
  • теперь составляет 17 мс, что меньше одного фиксированного временного шага -> состояние игры завершено, обновление
  • перейти к следующему кадру

  • 1 кадр проходит со скоростью 10 кадров в секунду, время кадра было 1000 мс / 10 = 100 мс

  • 100мс добавлено в аккумулятор
  • аккумулятор теперь 117мс
  • игровое состояние передается на 1 фиксированный временной шаг (33 мс), это время вычитается из аккумулятора
  • теперь составляет 84 мс, что составляет более одного фиксированного временного шага -> состояние игры не завершено, обновление
  • игровое состояние передается на 1 фиксированный временной шаг (33 мс), это время вычитается из аккумулятора
  • теперь составляет 51 мс, что составляет более одного фиксированного временного шага -> состояние игры не завершено, обновление
  • игровое состояние передается на 1 фиксированный временной шаг (33 мс), это время вычитается из аккумулятора
  • теперь составляет 18 мс, что составляет менее одного фиксированного временного шага -> состояние игры завершено, обновление
  • перейти к следующему кадру

Есть отличная статья Гленна Фидлера только об этой проблеме. Вы можете найти это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...