跳跃功能 - 帧率的高度不同
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
计算会发生变化,但这正是您的游戏决定物理效果的方式 - 关键是该值在 运行 同一游戏的所有客户端中都是固定的。
对于 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
计算会发生变化,但这正是您的游戏决定物理效果的方式 - 关键是该值在 运行 同一游戏的所有客户端中都是固定的。