固定时间步长的插值

时间:2013-07-24 03:03:21

标签: c++ opengl sfml game-loop

我一直在努力实现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());
}

此代码在物理循环之外调用(以30FPS运行),因此尽可能频繁地调用。

last_x变量在物理循环内设置为图像的x值。

一切似乎都有意义,但这段代码:

draw(image_->getX()*interpolation + last_x*(1-interpolation),image_->getY());

基本上,我总是根据最后一个x(它将比当前的x小)增加距离,所以这种效果看起来很自然,因为它需要当前和最后位置的“平均值”,这显然会小于当前的x位置,产生如下所示的效果:

(黑框是正确的位置,红框是带插值的精灵位置) problem

所以问题是,我在哪里错了?

编辑:我发现每次渲染调用设置坐标

image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);

是图片中错误的根源。然而,当图像处于正确的位置时,无论我用它多少玩耍,我都看不到插值的明显差异。

所以我猜最后一个问题是:我的插值算法是否正确且有效?我希望插值能做太多吗?

0 个答案:

没有答案