对不起,我无法正确说出我的标题,但我会在这里更加清晰地解释我的问题。
我正在使用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参数是模拟的时间量但是这个值不应该变化。
提前谢谢你。
答案 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实例大致相同的速度进行更新。