0

我一直在尝试实现在 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);

是图片中错误的根源。然而,虽然图像在正确的位置,但无论我怎么玩它,我都看不到插值的明显差异。

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

4

0 回答 0