Box2d动态子弹体沉入静体

时间:2012-04-11 23:31:58

标签: cocos2d-iphone box2d collision bullet

我正在使用box2d在cocos2d中制作游戏,我遇到了一些问题。

我让程序遍历tilemap的(.tmx)行和列,搜索“collidable”属性设置为“true”的tile。如果找到一个,则在该图块的位置设置方形静态box2d主体(带有灯具和所有)。基本上,我应该在迭代完成后最终设置一堆方形体,我需要它们(取决于tilemap)。我还有一个由手势控制的方形动态体(向上手势向上滑动,向下向下手势等),并且它应该仅在四个方向中的一个方向上移动:向上,向下,向左,向右。身体的恢复是0.0f,因此它在没有反弹的情况下停止撞击,并且摩擦力也是0.0f,因为它不需要(世界的重力是0.0f,也是0.0f)。由于通过tilemap的迭代只能放置正方形的物体,因此游戏中的“墙壁”由几个相邻排列的正方形组成,端到端,这为动态物体碰撞创造了一个齐平的边缘用。

当动态体与正方形墙碰撞时,问题就出现了。我通过根据手势设置身体的速度来控制身体的运动。向右移动的一个例子是:

#define bodyVel 100
...
if (gestureRight)
{
body->SetLinearVelocity( b2Vec2(bodyVel / PTM_RATIO, 0) );
}

我将身体设置为子弹,以便当它与墙壁碰撞时它不会嵌入,但我遇到了一些奇怪的结果。一个例子就是:

我将身体向右移动到墙上,然后停止。好。接下来,我想把它向上移动,所以我向上移动。好。但是,有时候,当它在墙上滑动时,身体似乎“抓住”了某些东西,它旋转失控并向多个方向旋转。坏。

我能想到的唯一解释是,动态的身体实际上会在第一个接触头上嵌入墙内,当它在下一个给定的移动姿势上滑上墙时,它会被抓住构成墙壁的正方形边缘之一,从直线路径变得震撼。我通过将主体设置为固定旋转(根本不旋转)来确认这种奇怪的活动,因此,它不会失去控制,而是停止。根据我的假设,这是预期的。因此,动态的身体正在成为我想说的内容。

我不明白为什么会这样,因为我的身体设置像子弹一样,以避免像这样的问题。我想让物体做的就是能够沿着直线路径 - 向上,向下,向左或向右 - 移动,在与墙壁接触时停止,并沿着墙壁移动而不受构成墙壁的物体的干扰。

我觉得除非我对子弹体如何工作有误解,否则正在发生的嵌入应该不是问题。

我还习惯使用DebugDraw来查看方形静体是否创建了一个齐平的墙,他们确实这样做了。

1 个答案:

答案 0 :(得分:1)

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

  

基于平铺的环境

     

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

     

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