【问题标题】:Jumping function - height different for framerates跳跃功能 - 帧速率的高度不同
【发布时间】:2017-08-16 15:08:55
【问题描述】:

对于 Jump'n'Run 游戏,我正在尝试进行跳跃,但我发现了这个功能。 问题是系统上的帧率(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;
}

【问题讨论】:

标签: java game-physics


【解决方案1】:

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

您应该为物理步长确定一个固定步长,例如 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,则计算会发生变化,但这正是您的游戏决定物理工作的方式 - 关键是该值在运行同一游戏的所有客户端中是固定的。

【讨论】:

  • 谢谢,我会试一试,然后回来报告:-)
  • @DennisEbner 很高兴为您提供帮助。请注意,您应该执行我仅在一个地方编写的逻辑,并覆盖每个相关物理对象中的阶跃函数。经常实现step,只写一次update
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
相关资源
最近更新 更多