2012-04-11 99 views
1

我正在用box2d在cocos2d上制作游戏,并且遇到了一些问题。Box2d动态子弹身体沉入静态物体

我有程序遍历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

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

瓷砖基础的环境

使用多盒为您的地形可能无法正常工作,因为盒状 字符可以在内部角落挂钩。未来更新至 Box2D应允许在边缘链上平滑移动。一般来说,您应避免使用矩形字符,因为容差仍然会导致不合需要的挂钩。

欲了解更多信息,请参阅这篇文章: http://box2d.org/forum/viewtopic.php?f=3&t=3048