我有一个接触式侦听器来检测子弹和小行星之间的碰撞。在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];
}
};
答案 0 :(得分:0)
我猜你在b2UserData
b2Body
或b2Fixure
的{{1}}中添加了指向精灵的指针,以便在碰撞发生时检索。当您删除精灵时,此指针将指向已删除的实例,因此您会收到EXC_BAD_ACCESS
。
你应该使指针无效以消除问题