2017-01-05 43 views
2

對不起,我無法正確說出我的標題,但我會在此處更清晰地解釋我的問題。Box2D以相同的速度移動物體,不管FPS

我正在使用libgdx。

當我想,以便它涵蓋了所有FPS相同的距離,我會做到這一點,以移動紋理:

//...define Player class with x property up here. 

Player player = new Player(); 
int SPEED = 100 
public void render() { 
    player.x += SPEED * Gdx.graphics.getDeltaTime(); 
} 

現在我想知道如何做到這一點會對身體產生相同的效果在box2d中。下面是一個例子(渲染延伸ApplicationAdapter一個類的方法):

public void render() { 

    //clear screen, ... do other stuff up here. 

    playerBody.applyForce(new Vector2(0.5f/PIXEL_PER_METER, 0.0f), playerBody.getWorldCenter(), true); 
    //PIXEL_PER_METER -> applied to scale everything down 

    //update all bodies 
    world.step(1/60f, 6, 2); 
} 

這對playerBody施加力,以便它的加速度增加。與我的第一個例子一樣,我如何製作海岸,身體的行進速度以30fps,10fps,60fps等保持恆定。我知道world.step的timeStep參數是模擬的時間量,但這個值不應該改變。

提前謝謝。

回答

1

就可以更新三角洲所有機構(未1/60固定增量)

world.step(Gdx.graphics.getDeltaTime(), 6, 2); 

編輯: 作爲@ Tenfour04提到,爲了防止高增量值(會導致巨大的跳躍),我們主要設置三角洲的帽子。

world.step(Math.min(Gdx.graphics.getDeltaTime(), 0.15f), 6, 2); 
+0

哦:)我認爲時間步參數必須始終具有相同的價值,永遠不會改變? – Nalyd

+0

一些遊戲開發者使用固定的delta(例如1/60)實現步驟邏輯。所以他們確保每一幀都會對遊戲產生相同的影響。對於多人遊戲的實現來說,我認爲它仍然是 – cokceken

+0

,對於在較慢的機器上運行遊戲的人來說,這不會造成巨大的劣勢嗎? – Nalyd

0

我不會用一個變量時步 - 這是我用過的辦法:

private float time = 0; 
private final float timestep = 1/60f; 

public void updateMethod(float delta) { 
    for(time += delta; time >= timestep; time -= timestep) 
     world.step(timestep, 6, 2); 
} 

基本上是一個變量上下的時間步長,但統一更新。

如果您在非常低的FPS運行遊戲,或者如果你將其與應用程序配置(例如用於測試)迫使這將不斷更新,在大致相同的速度作爲一個正常的60 FPS的實例。

看看Fix your timestep!

+0

我認爲你的代碼總是像world.step一樣工作(1/60f,6,2);因爲你不改變時間步長變量 – cokceken

+0

@cokceken但問題是它被稱爲次每秒的可變量,使其能夠趕上 – Moira

+0

那麼話說world.step(三角洲,6,2)基本相同。當增量變大時,用戶可能會遇到大的跳躍 – cokceken