无论FPS如何,Box2D以相同的速率移动物体

时间:2017-01-05 19:22:55

标签: java libgdx box2d

对不起,我无法正确说出我的标题,但我会在这里更加清晰地解释我的问题。

我正在使用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的类的render方法):

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参数是模拟的时间量但是这个值不应该变化。

提前谢谢你。

2 个答案:

答案 0 :(得分:2)

您可以使用delta(不是1/60固定增量)

更新所有实体
world.step(Math.min(Gdx.graphics.getDeltaTime(), 0.15f), 6, 2);

编辑: 正如@ Tenfour04所提到的,为了防止高delta值(引起巨大的跳跃),我们主要为delta设置上限。

{{1}}

答案 1 :(得分: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!