私は自分で修正できないような問題に遭遇しました。Libgdx補間されたレンダリングされたスプライトが理由なしに揺れます
私はこのような私のrender()メソッドでは、この固定されたタイムステップを実装している:上記のコードは、このリンクから最後の実装です
double time = TimeUtils.millis();
loops = 0;
while (time > nextGameTick && loops< MAX_FRAMESKIP) {
gameLogic(1f/gameSpeed);
nextGameTick += SKIP_TICKS;
loops++;
}
if(!rendererDisposed) {
interpolation = (time + SKIP_TICKS - nextGameTick)/(SKIP_TICKS);
camera.update();
renderer.render(interpolation);
hud.draw(dt);
}
:http://www.koonsolo.com/news/dewitters-gameloop/
そして、私のレンダラークラスは以下のようにバッチを描きますこの:
batch.draw(assets.getAnimation(),
player.getInterPos(interpolation).x,
player.getInterPos(interpolation).y,
player.getWidth()/2,
player.getHeight()/2,
player.getWidth(),
player.getHeight(), 1, 1,
player.getPolygon().getRotation());
とgetInterPos()
public Vector2 getInterPos(float delta){
interPosition.x = position.x *delta + previousPosition.x*(1-delta);
interPosition.y = position.y*delta + previousPosition.y*(1-delta);
return interPosition;
}
予想されること:補間は、前の位置と現在の位置との間を補間するために使用されているfloat値を0から1に戻します。
今私はTICKS_PER_SEC = 25です。FPS:25を持つことは、レンダラーとgamelogicが各フレームごとに1回呼び出されることを意味します。これは働く。
問題は、fps!= TICKS_PER_SECのときに開始されます。たとえば50fpsの場合、gamelogicは一度呼び出され、レンダラーは2回呼び出されると仮定します。補間は1番目と2番目のレンダラ呼び出しで0.5と1になりました。これも有効です。しかし、描画されたスプライトは奇妙な動作を開始し、上下にジャンプします。ここで
は、スプライト挙動を示すビデオです: https://www.youtube.com/watch?v=CE6cQr9o0kA
今の最大の謎は、我々はレンダラークラスでこれらの行を追加する場合
Gdx.app.log("player has y:"+player.getY()," and previous y:"+player.getPreviousPosition().y);
Gdx.app.log("interpolation: "+interpolation," position: +player.getInterPos(interpolation));
batch.draw(assets.getAnimation(), ... same as earlier
プレイヤーがyの持っているということです:23.62517:と、前をy:23.09717 補間:1.0:位置:(4.5,23.62517) y:24.145168:および前のy:23.62517 補間:0.5:位置:(4.5,23.88517) y:24.145168:およびそれ以前y: 23.62517 補間:1.0:位置:そう(4.5,24.401169)
currentPositionとpreviousPosition正しく更新されますと:24.657167::と前のY:24.145168 補間:0.5:位置(4.5,24.145168) プレイヤーは、Yを持っていますinterpolatedPositionです。 あなたが見ることができるように、ポジションは常に上昇し、ほぼ線形になっています。だから問題はなぜ地球上でバッチが2つの異なる位置にスプライトをレンダリングし、それらの間に交互になるのか?
マイ重力機能:
//dt is gameSpeed not the deltaTime
velocity.add(acceleration.x*dt,acceleration.y*dt);
position.add(velocity.x*dt,velocity.y*dt);
if (velocity.y<=-10)
velocity.y=-10;
私は、画面を押すと、この問題が発生した:
velocity.set(0,20);
余分な情報を:
- オブジェクトが問題を遅くしたように離れて を行きます
- オブジェクトが落ちたとき、同じことが起こるそれはgetPositionと
- 交換getInterPosを行いますフィートと右
- 高いFPSより浮き沈みは、問題を修正しますが、その後= TICKS_PER_SEC
FPSは、私は本当に私は、できるだけ徹底した願っています。このことは過去2週間私を苦しめています。私はそれを直すことができないようです。
ご協力いただきますようお願い申し上げます。
編集:
私は問題を解決できました。私はカメラを更新し、補間された位置の代わりに現在のロジック位置をプレーヤーに与え、ゲームロジック機能の内部でそれを更新していたからです。
だから私は
camera.position.y = player.getPosition().y;
から
camera.position.y = player.getInterPos(interpolate).y;
、それ以上の成果物への私のカメラの位置を変更!誰かが同様の問題に遭遇した場合に備えてここに残しておきます。
補間がキャストされ、さらにコードが浮動小数点に変換されます。それを行う正しい方法ではないと思いますか?いずれにせよ私はあなたの提案を試み、私ができるときに報告します!あなたのご意見ありがとうございます。 –
longをlongで分割すると、0に丸められます。たとえば、「59L/60L」は「0L」に等しくなります。したがって、補間値は常に0または1で、間にはありません。また、 '補間 'を浮動小数点として宣言しなければなりません。 – Tenfour04