【问题标题】:Box2D bodies moving for no reason?Box2D 身体无缘无故移动?
【发布时间】:2012-11-13 04:32:15
【问题描述】:

我在我的应用程序中使用 Box2D 和 Cocos2D。所以几乎在我的应用程序中,我让身体跟随我的 CCSprites,即使人们反对它。此外,我只使用 Box2D 进行碰撞检测,所以我只是将一个主体附加到我的精灵并使用 b2ContactListener 和 nothing 其他。无论如何,除了这个小问题之外,这个设置大部分都有效。

所以我的身体在游戏循环中像这样跟随我的精灵:

for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
                b2Vec2 b2Position = b2Vec2(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO);
                float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(sprite.rotation);
                b->SetTransform(b2Position, b2Angle);
        }
    }

我也像这样创建我的 b2World(如果有什么不同的话):

world = new b2World(b2Vec2(0.0f, 0.0f));
world->SetAllowSleeping(NO);
_contactListener = new MyContactListener();
world->SetContactListener(_contactListener); 

这个问题是,每当我的 CCSprite 碰撞(从技术上讲,我的 b2Body 也在碰撞)时,每个 CCSprite 上的 b2Body 似乎会移动一点,就好像一个微小的力刚刚击中它一样,所以如果这是有道理的,它们就会有“后坐力”。即使不涉及任何力量,当击中发生时,它们也会彼此远离。

另一个例子是当我的一个身体坐在另一个身体的顶部时,当我站在它的边缘时,被站立的身体似乎有点倾斜,这很奇怪,因为我没有倾斜我的精灵。

最后,我的身体似乎有点落后于精灵在那一刻的位置,我不确定这是否也与这个问题有关,但无论如何有什么理由会发生这种情况吗?有什么办法可以让物体不受力的影响,只用于碰撞?

谢谢!

【问题讨论】:

  • 我相信它是这样的:如果两个物体碰撞并且它们开始彼此远离,那么两个物体一定是用力相互碰撞的。他们每个人身上的力使它们运动,除非受到作用,否则运动中的物体会保持运动。如果它们在运动,它们将不会停止,因为没有其他东西作用于它们。我认为可能涉及到一种力量。
  • 有点,当身体相互碰撞时,身体会以不同的方式向奇怪的方向移动,但很快就会回到原来的位置,而实际上它们不应该向那个奇怪的方向移动总体。他们应该只是跟随他们所附着的精灵。除了 b2ContactListener 之外,我还必须在我的项目中添加任何强制或任何其他 Box2D 相关代码。
  • 现在我不确定这是否是一个问题,虽然我在调试我的 b2World 时确实看到了这种行为,但这可能不是发生以下情况的原因。现在在我的游戏中,我的身体有点小,它们确实移动得很快,有时当它们应该发生碰撞时它会因为未知原因而错过,尽管所有代码都是正确的,这可能是因为这个或我不确定的其他原因.任何提示/想法/建议将不胜感激!
  • 我不确定这是否是最好的方法,但如果有人想确认这一点:您是否尝试在碰撞发生时将两个对象都设置为静态? objectA->setType(b2_staticBody)
  • 或者更好的是在它们碰撞时将它们的速度设置为零?

标签: ios cocos2d-iphone box2d collision-detection


【解决方案1】:

我相信身体会在碰撞时触发碰撞响应,这会导致它们暂时分开一点,然后在您强制它们的 b2transform 与精灵的位置/角度在下一个游戏滴答中同步时恢复原位。

由于您将 Box2D 纯粹用于碰撞检测,您是否将夹具定义的 isSensor 属性设置为 true?

b2FixtureDef shapeDef;
shapeDef.isSensor = true;

通过将灯具特别标记为传感器,它永远不会与任何物体发生物理碰撞,但当物体发生重叠时,您仍会通过接触侦听器收到通知。

【讨论】:

  • 目前我没有在任何地方将 isSensor 设置为 true,因此它是错误的 ATM。但是当我将它设置为 true 时,我的 b2ContactListener 将完全一样地工作,对吧?应该不会有任何明显的差异吧?
  • 哦,我刚刚重新阅读了您的答案,现在很有意义。我会试试的,会让你知道它是怎么回事! :P
  • 它应该是一样的。您应该能够抓住联系人并检查相应的夹具对。
  • 制作所有灯具传感器就足以判断两个物体是否接触。然而,由于不需要碰撞反应,引擎不会计算任何通常的接触点或法线等,因此接触将用于查找接触的固定装置,仅此而已。 (很可能这对布拉德的情况很好,我只是在期待下一个可能的问题:)
  • 不,我确实需要 worldManifold 来进行碰撞,所以它会导致我的碰撞如果不触发,因为我也会检查它以获得更准确的碰撞。
猜你喜欢
  • 2020-04-09
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多