我一直在尝试实现在 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 位置,产生如下所示的效果:
(黑框为正确位置,红框为插值后的Sprite位置)
所以问题是,我在哪里做错了?
编辑:好吧,我发现每次渲染调用都设置坐标
image_->setX(box_.getRect().x);
image_->setY(box_.getRect().y);
是图片中错误的根源。然而,虽然图像在正确的位置,但无论我怎么玩它,我都看不到插值的明显差异。
所以我想最后一个问题是:我的插值算法是否正确且有效?我是否期望插值做太多?