0

我已经意识到 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

谢谢。

4

2 回答 2

1

尽管你破坏了body,但sprite它会继续做它的事情,所以你也可以从它的父级中删除精灵,比如.-

if ([testSprite physicsSprite].position.x < 0) {
    world->DestroyBody([testSprite physicsSprite].b2Body);
    [[testSprite physicsSprite] removeFromParentAndCleanup:YES];
}
于 2013-04-18T07:52:32.780 回答
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->data 将它的主体连接到精灵。您可以在上面的方法中看到这一点。

如果您从 CCPhysicsSprite 对象开始,您将首先从 sprite 中获取 cpBody 对象,然后如上所示移除身体和形状。

于 2013-07-22T05:15:51.773 回答