跳跃功能 - 帧率的高度不同

Jumping function - height different for framerates

对于 Jump'n'运行 游戏,我正在尝试跳跃,我发现了这个功能。 问题是系统上的帧率 (time_diff) 不同,所以有时它是示例 1,有时是 10。

现在这个函数会导致我的角色根据帧率跳跃不同的高度

public void jump() {
    ySpeed = -100;
}

// time_diff is time difference between this and last frame
public void update(double time_diff) {
    y = y - ySpeed * time_diff;
    ySpeed = ySpeed + 9.81 * time_diff;
}

这也是帧速率 4 和 20 的示例(这些值不准确,因为我将它们除以 20),但是您会看到帧速率 20 跳得更高(并且跳得更远)与帧速率一样4.

那我怎样才能做到无论帧率是多少,跳跃高度总是恒定的呢?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 编辑 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

我在 luk2302 的帮助下解决了这个问题:

double remaining_time = 0;
final double step_size = 4;

public void jump() {
    ySpeed = -100;
}

// time_diff is time difference between this and last frame
public void update(double time_diff) {
    remaining_time += time_diff;
    while (remaining_time >= step_size) {
        update_helper(step_size);
        remaining_time -= step_size;
    }
}

public void update_helper(double time_diff) {
    y = y - ySpeed * time_diff;
    ySpeed = ySpeed + 9.81 * time_diff;
}

要点:帧速率绝不能对物理计算产生任何影响。

你应该做的是为物理步骤确定一个固定的步长,比如 1/100 秒。然后你总是只执行那些步骤,不多也不少。累积时间,直到达到步数偏移量,如果累积时间太多,则执行多步:

double remaining_time;
final double step_size;
public void update(double diff) {
    remaining_time += diff;
    while (remaining_time >= step_size) {
        step(step_size); // perform your actual physics logic
        remaining_time -= step_size;
    }
}

如果您更改 step_size 计算会发生变化,但这正是您的游戏决定物理效果的方式 - 关键是该值在 运行 同一游戏的所有客户端中都是固定的。