我意识到CCPhysicsSprite在很多方面与CCSprite不同。例如,您必须在设置精灵位置之前设置正文。我相信当我尝试破坏身体时,这些差异之一会导致EXC_BAD_ACCESS错误。我在update方法中调用了scheduleSprite方法。
-(void)scheduleSprite {
if ([testSprite physicsSprite].b2Body != NULL) {
b2Vec2 force = b2Vec2(-5, 10.0 * [testSprite physicsSprite].b2Body->GetMass());
[testSprite physicsSprite].b2Body->ApplyForce(force, [testSprite physicsSprite].b2Body->GetWorldCenter() );
if ([testSprite physicsSprite].position.x < 0) {
world->DestroyBody([testSprite physicsSprite].b2Body);
[testSprite physicsSprite].b2Body = NULL;
}
}
}
我得到一个指向行
的EXC_BAD_ACCESSb2Vec2 pos = _b2Body->GetPosition();
中的
-(CGAffineTransform) nodeToParentTransform
方法,在类
中CCPhysicsSprite.mm
感谢。
答案 0 :(得分:1)
尽管你破坏了body
,但sprite
会继续做它的东西,所以你也可以从它的父节点中移除精灵,比如.-
if ([testSprite physicsSprite].position.x < 0) {
world->DestroyBody([testSprite physicsSprite].b2Body);
[[testSprite physicsSprite] removeFromParentAndCleanup:YES];
}
答案 1 :(得分:0)
- (void) killBody:(cpBody*)body
{
cpBodyEachShape_b(body, ^(cpShape *shape) {
cpSpaceRemoveShape( _space, shape );
cpShapeFree(shape);
});
cpSpaceRemoveBody( _space, body );
cpBodyFree(body);//edited to include this line
CCPhysicsSprite* sprite = (__bridge CCPhysicsSprite*) body->data;
[sprite removeFromParentAndCleanup:true];
}
我得到同样的东西,上面的方法似乎解决了它。 首先,从空间中移除附着在身体上的形状。我使用_space作为指向cpSpace对象的实例变量。接下来,从空间中移除主体。最后,从父级中删除精灵。
当我创建一个CCPhysicsSprite对象时,我使用body-&gt;数据将其主体连接到sprite。你可以在上面的方法中看到它。
如果您从CCPhysicsSprite对象开始,您将首先从精灵中获取cpBody对象,然后移除正文和形状,如上所示。