0

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

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

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

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

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

谢谢!

4

1 回答 1

3

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

Since you are using Box2D purely for collision detection, did you set the isSensor property of your fixture definition to true?

b2FixtureDef shapeDef;
shapeDef.isSensor = true;

By specially marking the fixture as a sensor, it will never physically collide with anything, but you will still be notified when an overlap of bodies occur, via the contact listener.

于 2012-11-13T05:02:02.883 回答