我正在尝试实现一种简单的跳跃算法,该算法应独立于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无关,我需要更改什么?
答案 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));
}
您可以尝试强制设置帧速率,但始终必须计算实际时差。