2016-12-13 33 views
0

我碰到過一個我自己無法修復的問題。Libgdx插值渲染精靈無故抖動

我已經實現了這個固定的時間步長在我的渲染()方法是這樣的:

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; 
} 

什麼是預期的:插值返回從0到1的浮點值,用於在先前和當前位置之間插值。

現在我的TICKS_PER_SEC = 25。擁有FPS:25意味着渲染器和gamelogic每幀每調用一次。這工作。

問題在fps!= TICKS_PER_SEC時開始。例如,我們假設gamelogic將被調用一次,渲染器將被調用兩次。現在在第一次和第二次渲染器調用時插值爲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.145168) 玩家Y:24.657167:和以往的Y:24.145168 插補:0.5:位置:(4.5,24.401169)

currentPosition和previousPosition得到正確更新也是如此interpolatedPosition。 正如你所看到的那樣,這個位置總是上升的,而且幾乎是線性的。所以問題是爲什麼在這個批處理中,精靈會在兩個不同的位置渲染它們並在它們之間交替?

我的重力功能:

//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); 

額外的信息:

  • 作爲對象減慢的問題消失
  • 同樣的事情發生時,對象自由落體,去吧英尺,右
  • 越高的FPS更加跌宕起伏它會做
  • 與爲getPosition更換getInterPos解決這個問題,但隨後的FPS = TICKS_PER_SEC

我真希望我是儘可能徹底。在過去的兩週裏,這些事情一直讓我瘋狂,我似乎無法修復它。

任何幫助將不勝感激!

編輯:

我已經設法解決這個問題。這是因爲我正在更新相機並給予我的玩家當前邏輯位置而不是內插位置,並在遊戲邏輯功能中更新它。

所以我改變了我的相機定位從

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

當您將一個長整數除長時,您會得到一個長整數,例如「0」。例如'59L/60L'等於'0L'。所以你的插值永遠是0或1,絕不會介於兩者之間。你還必須聲明'插值'作爲一個浮點數。 – Tenfour04