Box2D b2ContactListener(碰撞检测)

时间:2011-11-12 01:30:27

标签: ios cocos2d-iphone collision-detection box2d

在我的游戏中,我有大约6种不同的对象变体。每个对象都附有一个b2Body,b2BodyDef和b2FixtureDef。 在我的情况下,我的b2Bodys正在关注我的CCSprites,因为Cocos2D更容易使用动画。

无论如何,我试图关注Ray Wenderlich的教程:http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

事情是我对他实际做的事情感到很困惑! 问题: 1.我的CCScene中的Contact Listener代码是否需要在我的游戏循环中? 这是他在CCScene中进行碰撞检测的主要代码: 3.我也看到在下面的代码中他使用了CCSprites的标签,这是否意味着我的CCSprites不一定是ivars?那么我的b2Bodys,b2BodyDefs和b2FixtureDefs呢,他们必须是ivars吗?他只是用标签做的吗?

std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin();
    pos != _contactListener->_contacts.end(); ++pos) {
    MyContact contact = *pos;

    b2Body *bodyA = contact.fixtureA->GetBody();
    b2Body *bodyB = contact.fixtureB->GetBody();
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
        CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
        CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();

        if (spriteA.tag == 1 && spriteB.tag == 2) {
            toDestroy.push_back(bodyA);
        } else if (spriteA.tag == 2 && spriteB.tag == 1) {
            toDestroy.push_back(bodyB);
        }
    }
}

std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
    b2Body *body = *pos2;
    if (body->GetUserData() != NULL) {
        CCSprite *sprite = (CCSprite *) body->GetUserData();
        [_spriteSheet removeChild:sprite cleanup:YES];
    }
    _world->DestroyBody(body);
}

if (toDestroy.size() > 0) {
    [[SimpleAudioEngine sharedEngine] playEffect:@"hahaha.caf"];
}
事情就像以前一样,他只有两件可以碰撞的东西。在我的情况下,我有6.所以我必须以任何方式修改该代码以使用我的6个可能的b2Bodys吗?

谢谢!

0 个答案:

没有答案