2017-08-11 87 views
3

对于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.

Jump Image

那么我怎样才能存档它跳跃高度总是不变,不管帧率如何?

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

我解决它像这样蒙山的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; 
} 
+0

试图最大化'y'的新价值,反对'y'原值? –

+0

这是讲好你的主题:https://www.youtube.com/watch?v=hG9SzQxaCm8 – Andreas

回答

4

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

你应该做的是确定一个固定的步长像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计算的变化,但是这是你的游戏是如何决定的物理工作 - 关键是价值在所有运行同一游戏的客户端都是固定的。

+0

谢谢,我会试试看,回来报告:-) –

+0

尼斯,再次感谢,刚刚更新了我的问题与我的解决方案... –

+1

@DennisEbner乐于帮助。请注意,您应该只执行一次写入的逻辑,并覆盖每个相关物理对象中的阶跃函数。经常执行'step',只写'update'一次。 – luk2302