1

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

我让程序遍历 tilemap 的 (.tmx) 行和列,搜索“collidable”属性设置为“true”的图块。如果找到,则在该图块的位置设置一个方形静态 box2d 主体(带有固定装置和所有)。所以本质上,我应该在迭代完成后在我需要的地方设置一堆方形物体(取决于瓷砖地图)。我还有一个由手势控制的方形动态主体(向上手势向上滑动,向下手势向下滑动等),它应该只在四个方向之一上移动:上、下、左、右。身体的恢复是 0.0f,因此它会在没有反弹的情况下停止撞击,并且摩擦也是 0.0f,因为不需要它(世界重力是 0.0f,也是 0.0f)。

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

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

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

我将身体向右移动到墙上,它停止了。好的。接下来,我想向上移动它,所以我向上示意。好的。但是,有时,当它在墙上滑动时,身体似乎“抓住”了什么东西,它会失去控制并朝多个方向旋转。坏的。

我能想到的唯一解释是,动态体实际上是在第一个接触的头时嵌入到墙上的,并且当它在下一个给定的运动手势时向上滑动时,它被卡在了构成墙壁的正方形的边缘,并从笔直的路径中变得刺耳。我通过将身体设置为固定旋转(根本不旋转)来确认这个奇怪的活动,因此,它不会失去控制,而是简单地停止。鉴于我的假设,这是意料之中的。所以动态的身体正在变得嵌入是我想说的。

我不明白为什么会发生这种情况,因为我将身体设置为像子弹一样行事,以避免完全像这样的问题。我想要物体做的就是能够沿着笔直的路径移动——无论是向上、向下、向左还是向右——在与墙壁接触时停止,并沿着墙壁移动而不受构成墙壁的物体的干扰.

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

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

4

1 回答 1

1

不幸的是,这是 Box2d 中的一个已知问题......来自常见问题解答

基于瓷砖的环境

为您的地形使用多个框可能效果不佳,因为类似框的字符可能会卡在内部角落。Box2D 的未来更新应该允许边缘链上的平滑运动。一般来说,您应该避免使用矩形字符,因为碰撞容差仍会导致不希望出现的阻碍。

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

于 2012-04-12T18:07:35.647 回答