我一直在努力实现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位置,产生如下所示的效果:
(黑框是正确的位置,红框是带插值的精灵位置)
所以问题是,我在哪里错了?
编辑:我发现每次渲染调用设置坐标image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);
是图片中错误的根源。然而,当图像处于正确的位置时,无论我用它多少玩耍,我都看不到插值的明显差异。
所以我猜最后一个问题是:我的插值算法是否正确且有效?我希望插值能做太多吗?