b2contactlistener中的回调begincontact

时间:2013-06-20 08:34:35

标签: iphone cocos2d-iphone box2d

我有一个接触式侦听器来检测子弹和小行星之间的碰撞。在beginContact函数中,我检查sprite类型并从此函数中触发一个块。

在将联系人侦听器分配给box2dworld之前,该块在分配时由场景类设置。子弹和小行星都得到了箱体和精灵。

问题是我可以访问精灵并随心所欲地做任何事情(运行动作,停止动作等)。

但是,只要我在sprite上调用removeChild函数,我就会在监听器上的b2Contact :: Update中获得一个EXC_BAD_ACCESS-> BeginContact(this)。

有人能指出我正确的方向吗?

我的勾选功能:

//Physics simulation
_world->Step(dt, 10, 10);
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);
    }
}

for(CCSprite *sprite in spritesToDelete) {
    [self removeSprite:sprite];
    [spritesToDelete removeObject:sprite];
    sprite = nil;
}

我的联系人监听器回调块:

 contactListener->contactBlock = ^(CCSprite *A, CCSprite *B) {

        NSLog(@"A: %@", [A class]);
        NSLog(@"B: %@", [B class]);
        CCSprite *bullet = nil , *asteroid = nil;
        if ([(NSString *)A.userData isEqualToString:@"asteroid"] && [(NSString *)B.userData isEqualToString:@"bullet"])
        {
            asteroid = A;
            bullet = B;
        } else if ([(NSString *)B.userData isEqualToString:@"asteroid"] && [(NSString *)A.userData isEqualToString:@"bullet"])
        {
            asteroid = B;
            bullet = A;
        }

        if (asteroid != nil && bullet != nil) {
            NSLog(@"Asteroid Hit!");
            [asteroid stopAllActions];
            [bullet stopAllActions];
            //If I keep the line below uncommented, I get the error. Adding actions and stuff does not make an issue, only removal of sprite is when I get the error.
            [spritesToDelete addObject:bullet];
        }

    };

1 个答案:

答案 0 :(得分:0)

我猜你在b2UserData b2Bodyb2Fixure的{​​{1}}中添加了指向精灵的指针,以便在碰撞发生时检索。当您删除精灵时,此指针将指向已删除的实例,因此您会收到EXC_BAD_ACCESS

你应该使指针无效以消除问题