在3个实体同时发生碰撞时获得EXC_BAD_ACCESS

时间:2013-06-18 11:16:07

标签: cocos2d-iphone

我有3个box2d的尸体。他们都有用户数据。他们的userData标签如下所示。

BODY 1: Tag = 1
BODY 2: Tag = 1
BODY 3: Tag = 2

此外,在我的代码中,我已经实现了联系人监听器来检测主体之间的联系,我已经设置了Body 3将被销毁的条件: BODY1和BODY3 之间的冲突或 BODY2和BODY3 < /强>

但是当BODY1和BODY2同时与BODY3发生碰撞时,我正在 EXC_BAD_ACCESS 。我知道为什么会出现这个错误:这是因为没有要移除的主体,因为它在第一次接触时被移除。

任何人都知道如何解决此错误?

1 个答案:

答案 0 :(得分:1)

您可以设置一个条件来检查您的碰撞体是否为== NULL。

如果不是,请将其销毁。如果是的话,那就是它已经被摧毁了。

编辑:

为了保留您的特定标签系统,您可以将NSDictionary作为每个身体的用户数据传递:

bodyDef.userData = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithInt:theBodyTag], @"tag",
                             [NSNumber numberWithInt:theUniqueID], @"ID", 
                             nil];

然后,当碰撞时,您可以检查身体用户数据,并知道您是否在身体3的存在。

if ([(id)body1->GetUserData() objectForKey:@"ID"] == 3) {
        if ([(id)body2->GetUserData() objectForKey:@"ID"] == 1 || 
            [(id)body2->GetUserData() objectForKey:@"ID"] == 2) {
                Feed an array with the body to destroy and destroy it after your collision checks !
                [myQueue addObject:[(id)body2->GetUserData() objectForKey:@"ID"]];
        }
}

在碰撞例程之后,迭代所有物体并销毁那些将队列对象作为唯一ID的物体。

请注意,我没有检查此代码是否有效,但这是个主意。