为什么我的跳跃算法不能独立于FPS工作?

时间:2019-05-31 20:57:06

标签: java game-physics

我正在尝试实现一种简单的跳跃算法,该算法应独立于FPS。不幸的是,玩家以1-5 FPS跳了1.6-1.9格,但是以60 FPS跳了1.2格。

首先,加速度降低了 handleOnChange = async selectedObj => { let responseObj = await callRestAPI(`www.example-${env}.com`); this.props.onChange(selectedObj); }; 。如果y位置小于0.15,则说明玩家正在开始新的跳跃(GRAVITY * time for the last frame设置为yAcceleration)。

JUMP_POWER

这是我在测试示例中用来调用private static final float GRAVITY = 9; private static final float JUMP_POWER = 4.4f; private static final float TOLERANCE = 0.15f; private float yAccleration; private float positionY; //delta is in seconds private void update(float delta) { yAccleration -= GRAVITY * delta; if(positionY <= TOLERANCE) { yAccleration = JUMP_POWER; } float newYPosition = positionY + yAccleration * delta; if(newYPosition > 0) positionY = newYPosition; } 的代码:

update()

为了使我的算法与FPS无关,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

final float fps = 60;
final float deltaSeconds = 1f / fps;

当我读到这篇文章时,它就是“ WTF”。您不能假定增量为1/60秒。而且,不会!

1/60秒只是您的等待时间。那么计算呢?实际获得当前时间所需的时间呢?重绘时间呢?一切都重要!

不建议使用固定的虚幻增量,只需在每次迭代中计算实际时间即可。

final float fps = 60;
final float deltaSeconds = 1f / fps;
float t0=System.currentMilisecond();
while(true) {
    float t=Sytem.currentMiliseconds();
    float delta=t-t0;
    t0=t;
    update(delta);
    Thread.sleep((int) Math.round(deltaSeconds * 1000));
} 

您可以尝试强制设置帧速率,但始终必须计算实际时差。