我有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 。我知道为什么会出现这个错误:这是因为没有要移除的主体,因为它在第一次接触时被移除。
任何人都知道如何解决此错误?
答案 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的物体。
请注意,我没有检查此代码是否有效,但这是个主意。