【问题标题】:Box2d Body can not destroy when touch with another bodyBox2d Body 与另一个物体接触时不会破坏
【发布时间】:2012-08-09 10:02:32
【问题描述】:

我正在使用基于 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 文件中。

请帮我解决这个问题。 提前致谢

【问题讨论】:

  • 您确定双方的用户数据始终是 CCSprite 类型吗?也许您的对象与墙壁或具有除精灵以外的用户数据的东西发生碰撞
  • 是的,在我的游戏情况下,CCSprite 是动态体,边缘是静态体。但是在这里我的玩家精灵与敌人的身体相撞,当时金刚砂的身体被摧毁了。但没有完成。所以有什么想法吗??
  • 也许你在不止一次接触中拥有相同的敌人身体? (你确定 _contacts 只包含唯一的对象吗?

标签: cocos2d-iphone box2d-iphone


【解决方案1】:

您犯了一个根本错误,即处理与玩家的敌人接触与玩家与敌人的接触不同(这只是事情的顺序),您应该将这两种情况视为相同,因为您无法知道它们到达的顺序。 你也没有正确使用 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

【讨论】:

  • 感谢您的回答。应用 toDestroy 并从销毁中删除所有内容后,当玩家身体接触到边缘身体时,就会出现 EXE_BAD_ACCESS 和游戏崩溃等错误。下次碰撞怎么办??
  • 我认为 toDestroy 可能没有被初始化检查。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多