如何使用CCPhysicsSprite破坏身体

时间:2013-04-18 06:21:42

标签: cocos2d-iphone box2d physics box2d-iphone

我意识到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_ACCESS
b2Vec2 pos  = _b2Body->GetPosition();

中的

-(CGAffineTransform) nodeToParentTransform

方法,在类

CCPhysicsSprite.mm

感谢。

2 个答案:

答案 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对象,然后移除正文和形状,如上所示。