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);
写真のエラーの根本でした。ただし、画像は正しい場所にありますが、いくらいじっても、補間による目に見える違いは見られません。
最後の質問は次のとおりだと思います:私の補間アルゴリズムは正しく機能していますか? 補間が多すぎることを期待していますか?