2011-03-29 27 views
3

我想知道是否有人可以帮助我理解在box2d中修复我的时间步骤。我试图通过实现更好的时间步骤(我目前使用内置的可变时间步骤)来改善我刚刚发布的游戏Bounce Z Ballz。我一直在阅读一些有用的信息,但我无法真正把握自己的头脑,将类似于内置cocos2d/box2d模板的东西变成类似 Glenn Fiedler's的解决方案。如何在box2d中实现更好的时间步(固定或半固定)?

TL; DR(我想我的cocos2d/Box2D的游戏时间步长从内置的可变时间步长的东西比较一致的变化)

感谢,

史蒂夫

回答

8

为了实现这个,你需要知道你的物理引擎在充分执行的同时可以执行的最大时间步。为了论证的缘故,假设它是0.03秒。

本质上,在您的更新循环中,不是将delta时间传递给步长时间,而是将其分解为最大大小的段。因此,如果当前循环周期的增量时间为0.08秒,那么您需要运行更新循环3次,时间步长为0.03 s,0.03 s,0.02 s。物理系统仍然进行了0.08秒,但它将以足够小的步骤正确执行。

Update:(float)deltaTime 
{ 
    float maximumStep = 0.03; 
    float progress = 0.0; 
    while (progress < deltaTime) 
    { 
     float step = min((deltaTime-progress), maxStep); 
     **PHYSICS STEP(step)** 
     progress += step; 
    } 
} 
+0

好的,谢谢Jordaan。这是迄今为止我听到的最简单的解释。所以在我的init方法中,当我打电话时:[self schedule: @selector(tick:)]是否需要包含其他参数?此外,这个实现是否会在不同的设备上创建一个一致的(几乎相同的,如果不相同的)模拟,这些设备可能以不同的FPS显示(例如iphone 3gs和iphone 4)? – SteveWight 2011-03-29 01:10:25

+0

是的,基本上。这一切都取决于你选择maximumStep值的方式。试一试,并检查box2d的文档,看看他们是否提供了一个值。但是请注意,将该值设置得过低可能会降低整个系统的性能,因为物理系统必须更频繁地工作。 – 2011-03-29 01:20:57

+0

太好了。我已经实现了这个解决方案,一切似乎都运行得更加一致。我需要再测试一次,但再次感谢Jordaan,这就是我一直在寻找的。 – SteveWight 2011-03-29 01:41:50