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

Java 为什么我的跳跃算法不能独立于FPS工作?,java,game-physics,Java,Game Physics,我正在尝试实现一个简单的跳跃算法,它应该与FPS无关。不幸的是,玩家以1-5 FPS的速度跳1.6-1.9个方块,但以60 FPS的速度跳1.2个方块 首先,最后一帧的加速度降低了重力*时间。如果y位置小于0.15,则玩家开始新的跳跃(yAcceleration设置为jump\u POWER) 为了使算法FPS独立,我必须改变什么 final float fps = 60; final float deltaSeconds = 1f / fps; 当我读到这篇文章的时候,它马上就是“WTF”。

我正在尝试实现一个简单的跳跃算法,它应该与FPS无关。不幸的是,玩家以1-5 FPS的速度跳1.6-1.9个方块,但以60 FPS的速度跳1.2个方块

首先,最后一帧的加速度降低了
重力*时间。如果y位置小于0.15,则玩家开始新的跳跃(
yAcceleration
设置为
jump\u POWER

为了使算法FPS独立,我必须改变什么

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));
} 

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

处理向量会更容易。但在1d中确实有点多余。是的,当然,你是对的,在我的真实游戏引擎中我使用向量,但在这个简单的例子中重现这个问题,我认为这有点过分了。在本例中,我添加了用于调用
update()
的代码。我发现了错误,但还无法解决。开始跳跃时,Y加速设置为
JUMP\u POWER
。之后,我将
yAcceleration*delta
添加到该位置。当我以很低的FPS速度运行游戏时,例如,1fps,加速度(开始跳跃时为4.4)乘以1。因此,我将+4.4添加到
yPosition
,这不是我想要的(玩家应该跳转1-1.5个方块)。你想要的是单位/秒或单位/帧的速度。您需要的是后一个选项。在本例中,没有进一步的计算,也没有绘制任何内容。
while(true)
循环中提供的代码就是我正在做的全部。游戏循环包括重画。在你的情况下,如果没有,你的计算是在“不同的时间线”。几天前,我刚刚为自己制作了弹跳球,在重力、弹跳和2d运动方面完全没有问题。总而言之,你在1/60秒的时间内进行的计算是不可靠的。还有积分方法的问题——OP使用的是欧拉,在大时间步长下会产生糟糕的结果。什么是积分方法?
positionY=positionY+yAccleration*delta
对垂直加速度进行数值积分(这也是错误的)关于时间。这种特殊的方法对于较大的时间步长是非常不准确的(它“超调”了Y位置相对于时间的实际曲线)。
final float fps = 60;
final float deltaSeconds = 1f / fps;
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));
}