Cocos2d iphone 如何用CCPhysicsPrite摧毁一具尸体

Cocos2d iphone 如何用CCPhysicsPrite摧毁一具尸体,cocos2d-iphone,box2d,physics,box2d-iphone,Cocos2d Iphone,Box2d,Physics,Box2d Iphone,我已经意识到CCPhysicsPrite与CCSprite在一些方面有所不同。例如,必须在设置精灵的位置之前设置主体。我相信,当我试图摧毁尸体时,正是这些差异之一导致了EXC_BAD_访问错误。我在update方法中调用scheduleSprite方法 -(void)scheduleSprite { if ([testSprite physicsSprite].b2Body != NULL) { b2Vec2 force = b2Vec2(-5, 10.0 * [testSprite phys

我已经意识到CCPhysicsPrite与CCSprite在一些方面有所不同。例如,必须在设置精灵的位置之前设置主体。我相信,当我试图摧毁尸体时,正是这些差异之一导致了EXC_BAD_访问错误。我在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;
    }
}
}

-(CGAffineTransform) nodeToParentTransform
方法,在类内

CCPhysicsSprite.mm

谢谢。

尽管您销毁了
主体
,但
精灵
仍将继续工作,因此您也可以将精灵从其父级移除,例如-

if ([testSprite physicsSprite].position.x < 0) {
    world->DestroyBody([testSprite physicsSprite].b2Body);
    [[testSprite physicsSprite] removeFromParentAndCleanup:YES];
}
if([testSprite physicsprite].position.x<0){
世界->毁灭体([testSprite physicsSprite].b2Body);
[[testSprite physicsSprite]从父项移除并清除:是];
}
我得到了同样的东西,上面的方法似乎解决了它。 首先,从空间中删除附着到主体的形状。我使用_space作为指向cpSpace对象的实例变量。接下来,从空间中移除主体。最后,从父对象中删除精灵

当我创建CCPhysicsPrite对象时,我使用body->data将其主体连接到精灵。你可以在上面的方法中看到这一点


如果从CCPhysicsPrite对象开始,首先从精灵中获取cpBody对象,然后移除身体和形状,如上图所示。

我刚刚添加了上述代码,但仍然出现EXC\u BAD\u访问错误。只是这次它指向了
if([testSprite physicsprite].b2Body!=NULL){
scheduleSprite
方法中的行
。嗯,像以前一样,将body引用设置为
NULL
(就在
销毁
从父级删除
调用之间)怎么样好的,以前没有意识到,但是可能是什么引发了异常,所以您也可以尝试
testSprite.physicsprite=NULL;
…并且在if语句中,您还可以检查[testSprite physicsprite]!=nil可能的重复
if ([testSprite physicsSprite].position.x < 0) {
    world->DestroyBody([testSprite physicsSprite].b2Body);
    [[testSprite physicsSprite] removeFromParentAndCleanup:YES];
}
- (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];
}