Box2d身体在与另一个身体接触时无法破坏

时间:2012-08-09 10:02:32

标签: cocos2d-iphone box2d-iphone

我正在使用基于box2d的游戏,它检测到我的玩家身体与敌人的身体相撞,但是当我在敌人的关键点为敌人编写destroybody方法时,我的敌人无法摧毁并出错,我的应用程序崩溃了。 我告诉你我的代码

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) 
            {
                // SpriteA = PlayerSprite
                // SpriteB = EnemySprite
                NSString *t=[NSString stringWithFormat:@"Game Over"];
                label.string=t;
                [self removeChild:spriteB cleanup:YES];
                 world->DestroyBody(bodyB);
            } 
            else if (spriteA.tag == 2 && spriteB.tag == 1) 
            {
                //toDestroy.push_back(bodyB);
                NSLog(@"Enemy Touch");
            }
        }
    }

这里我的spriteB无法销毁。 还有一件事是敌人的精灵进入了Enemy.mm文件。

请帮助我,我遇到了这个问题。 提前致谢

1 个答案:

答案 0 :(得分:0)

你制造一个基本的错误,处理敌人与玩家接触敌人的联系(它只是事物的顺序),你应该对待这两种情况,因为你不知道他们到达的顺序。 你也没有正确使用toDestroy。

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) ||(spriteA.tag == 2 && spriteB.tag == 1)) 
            {
                // SpriteA = PlayerSprite
                // SpriteB = EnemySprite
                NSString *t=[NSString stringWithFormat:@"Game Over"];
                label.string=t;
                [self removeChild:spriteB cleanup:YES];
                 toDestroy.push_back(bodyB);
            } 

        }
        }
//iterate and delete everything from toDestroy