2016-12-13 3 views
0

私は自分で修正できないような問題に遭遇しました。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; 

、それ以上の成果物への私のカメラの位置を変更!誰かが同様の問題に遭遇した場合に備えてここに残しておきます。

答えて

0

これは唯一の問題ではありません。

millis()以来戻って長い、timeは、二重のない長さであるべきである:

long time = TimeUtils.millis(); // you declared time to be a double 

SKIP_TICKSnextGameTickもでなければなら憧れます。そして、分割する前に分子と分母を浮動小数点にキャストして補間が常に整数(0または1)になるわけではありません。

interpolation = (float)(time + SKIP_TICKS - nextGameTick)/(float)SKIP_TICKS; 
+0

補間がキャストされ、さらにコードが浮動小数点に変換されます。それを行う正しい方法ではないと思いますか?いずれにせよ私はあなたの提案を試み、私ができるときに報告します!あなたのご意見ありがとうございます。 –

+0

longをlongで分割すると、0に丸められます。たとえば、「59L/60L」は「0L」に等しくなります。したがって、補間値は常に0または1で、間にはありません。また、 '補間 'を浮動小数点として宣言しなければなりません。 – Tenfour04

関連する問題