簡體   English   中英

無論 FPS 如何,Box2D 都以相同的速率移動物體

[英]Box2D move bodies at same rate regardless of 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 參數是模擬的時間量,但是這個值不應該改變。

先感謝您。

我不會使用可變時間步長 - 這是我使用的方法:

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 實例大致相同的更新速度。

看看修復你的時間步長!

您可以使用增量更新所有主體(不是 1/60 固定增量)

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

編輯:正如@Tenfour04 所提到的,為了防止高 delta 值(導致巨大的跳躍),我們主要為 delta 設置一個上限。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM