什么可能导致Box2D突然停止?

时间:2012-12-18 18:48:53

标签: c++ box2d

我正在使用Box2d进行游戏,而且我有一个让我疯狂的错误。我把情况简化为一个方形播放器,在由一系列方形瓷砖组成的地板上无摩擦地来回滑动,由左右键(施加水平力)驱动。效果很好,在整个楼层来回滑动。

除了......每隔一段时间,玩家就会突然停留在其中一块瓷砖的边缘,好像它正在撞击(不存在的)墙壁。进一步向它行进的方向推进将会失败,但只要我向相反的方向向后推动一次,我就可以再次向前推动粘贴点。粘贴点似乎是随机的,除了位于瓷砖的边缘。向左或向右发生。

出于调试目的,我保留前两个更新标记的位置/速度值,并在发生此停止时将其打印出来。举个例子,你看到玩家向右移动,略微减速; pos2应该是大约8.7,但它会停止死亡。

tick0:  pos= 8.4636 vel= 7.1875
tick1:  pos= 8.5816 vel= 7.0833
tick2:  pos= 8.5816 vel= 0.0000

因此,当玩家为0.8并且牌区宽度为1.0时,玩家正在停止,因为它将要越过下一个牌(8.5816 + 0.8 / 2 = 8.9816)。事实上,我收到了一条冲突消息(除非注意到它发生了,否则我会忽略)。它似乎只发生在x.5816(或-x.4184)向右移动时,x.4167(或-x.5833)向左移动

我说这就像撞墙一样,但事实上,当它撞到一堵墙时,数字看起来更像是:

 tick0:  pos0= 12.4131 vel2= 8.4375
 tick1:  pos1= 12.5555 vel1= 8.5417
 tick2:  pos2= 12.5850 vel0= 0.0000

所以它在最后一个刻度上向右移动,这使它与墙壁接触。

有人见过这样的事吗?关于我如何导致这种行为的任何建议?

1 个答案:

答案 0 :(得分:3)

不幸的是,这是Box2d中的一个已知问题... from the FAQ

  

基于平铺的环境

     

为您的地形使用许多方框可能效果不佳,因为它们类似于盒子   角色可以在内角上被钩住。未来的更新   Box2D应允许边缘链上的平滑运动。一般来说你   应避免使用矩形字符,因为碰撞   公差仍然会导致不必要的阻碍。

     

有关更多信息,请参阅此帖子:   http://box2d.org/forum/viewtopic.php?f=3&t=3048

来自Box2d的创造者Eric Catto(强调补充):

  

我正在为边缘链工作,但是没有解决方案   相邻的多边形。 您最好使用一个或多个圈子   对于角色与环境。大多数专业游戏使用现代   物理引擎使用平滑的形状,如胶囊,用于角色。   使用字符的盒子形状实际上只适用于那些系统   使用基于像素的碰撞与积分数学(即较旧的控制台)   游戏)。

所以基本上,你的身体应该是一个光滑的形状,而不是一个多边形,这样它就不会在瓷砖之间产生障碍。