Я пытался реализовать игровой цикл, найденный в Gafferon Games http://gafferongames.com/game-physics/fix-your-timestep/ но я сталкиваюсь с проблемой, касающейся шага интерполяции.
Текущий алгоритм выглядит так:
void draw(float interpolation)
{
//Set image coordinates to that of its collision box
image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);
if(player moving)
draw(image_->getX()*interpolation + last_x*(1-interpolation),image_->getY());
else
draw(image_->getX(),image_->getY());
}
Этот код вызывается вне физического цикла (который работает со скоростью 30 кадров в секунду) и поэтому вызывается настолько часто, насколько это возможно.
last_x
переменная устанавливается внутри цикла физики на значение x изображения.
Кажется, все имеет смысл, но этот кусок кода:
draw(image_->getX()*interpolation + last_x*(1-interpolation),image_->getY());
По сути, я постоянно добавляю расстояние, основанное на последнем x (которое будет меньше текущего x), поэтому этот эффект кажется естественным, поскольку он принимает «среднее» от текущей и последней позиции, что, очевидно, будет меньше текущей x-позиции, создавая эффект, показанный ниже:
(Черный ящик — правильная позиция, красная коробка — местоположение спрайта с интерполяцией)
Итак, вопрос в том, где я ошибаюсь?
РЕДАКТИРОВАТЬ: Ну, я обнаружил, что установка координат каждый вызов рендеринга
image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);
Был корень ошибки на картинке. Однако, хотя изображение находится в правильном месте, я не вижу видимой разницы с интерполяцией, независимо от того, насколько я с ней играюсь.
Итак, я предполагаю, что последний вопрос: мой алгоритм интерполяции корректен и функционирует? Я ожидаю, что интерполяция сделает слишком много?
Задача ещё не решена.
Других решений пока нет …