0

在我的代码中,我想销毁两个接触的物体之一。在 beginContact 中调用了 CCPhysicsSprite 中的以下方法:

-(void)contactMade:(CCPhysicsSprite*)contactedSprite {
int spriteTag1 = self.tag;
int spriteTag2 = contactedSprite.tag;

if (((spriteTag1 == 3) && (spriteTag2 == 4)) || ((spriteTag1 == 4) && (spriteTag2 == 3)) {

   CCPhysicsSprite* heroSprite = (CCPhysicsSprite*)[self getChildByTag:4];
    b2World* world;

    world->DestroyBody(heroSprite.b2Body);
    heroSprite.b2Body = NULL;
    [heroSprite.parent removeChild:heroSprite];
}

我得到一个信号 SIGABRT 指向

b2Assert(m_bodyCount > 0);

在搜索了这个问题之后。我读到必须在时间步之后保存和销毁接触体。鉴于我在 CCPhyscisSprite 中设置了我的联系条件,我该怎么做。

4

1 回答 1

1

您可以向您的物理对象添加一个标志(如:isDead ...),在碰撞事件中只需将该标志值更改为 TRUE。

-(void) CollisionBegin:(b2Fixture*)target With:(b2Fixture*) source
{    
    if ( target->GetBody()->GetType() == b2_dynamicBody)
    {
        yourCustomClass *temp = (yourCustomClass *)target->GetBody()->GetUserData();
        temp->isDead = true ;
    }
}

然后在步骤之后的更新函数中获取所有物理世界的对象并通过标志(这里:isDead)找到该特定对象,并销毁它。

-(void) update: (ccTime) dt
{

    int32 velocityIterations = 8;
    int32 positionIterations = 3;

    world->Step(dt, velocityIterations, positionIterations);

    // remove your box2d object here , after step function

    for ( b2Body *b = world->GetBodyList(); b; )
    {
        b2Body *baba = b->GetNext();
        if ( b->GetUserData() != NULL && b->GetType() == b2_dynamicBody)
        {
            yourCustomClass *t = (yourCustomClass *)b->GetUserData();
            if ( t->isDead )
            {
                world->DestroyBody(b);    // remove physical body
                [self removeChild:t];     // remove node from super layer
            }
        }
        b = baba ;
    }
}
于 2013-05-14T17:13:19.830 回答