Box2D机构无缘无故地移动?

时间:2012-11-13 04:32:16

标签: ios cocos2d-iphone box2d collision-detection

我在我的应用程序中使用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); 

这个问题是,每当我的CCSprites发生碰撞时(技术上我的b2Bodys也会发生碰撞),每个CCSprite上的b2Body似乎移动了一下,好像一个微小的力量刚刚击中它所以如果有意义的话它们会有“反冲”。即使没有任何力量,它们在击中时也会相互移动得更远。

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

我相信这些物体在碰撞时会触发碰撞响应,导致它们瞬间分开一点,然后在你强制他们的b2变换与下一个游戏勾号中精灵的位置/角度同步时再回到原位。

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

b2FixtureDef shapeDef;
shapeDef.isSensor = true;

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