1

私はつい最近、cocos2d の Box2D 統合をいじり始めました。ほとんどのプロセスはシンプルで簡単ですが、CCPhysicsSprite (b2body をスプライトと統合する CCSprite サブクラス) を使用すると、EXC_BAD_ACCESS エラーが発生し続けます。私が使用しているコードは次のとおりです。

- (void)spawnBallAtPoint:(CGPoint)point
{
    count++;

    CCPhysicsSprite *sprite = [CCPhysicsSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
    sprite.position = point;
    [self addChild:sprite];

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(point.x / PTM_RATIO, point.y / PTM_RATIO);
    bodyDef.userData = sprite;
    b2Body *body = world->CreateBody(&bodyDef);

    b2CircleShape circleShape;
    circleShape.m_radius = (26.0 / PTM_RATIO);

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &circleShape;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.2f;
    fixtureDef.restitution = 0.8f;
    body->CreateFixture(&fixtureDef);

    sprite.b2Body = body;
}

このコードは EXC_BAD_ACCESS をトリガーします。CCPhysicsSprite を CCSprite に変更するとエラーが発生しないため、CCPhysicsSprite であることがわかります。

- (void)spawnBallAtPoint:(CGPoint)point
{
    count++;

    CCSprite *sprite = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
    sprite.position = point;
    [self addChild:sprite];

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(point.x / PTM_RATIO, point.y / PTM_RATIO);
    bodyDef.userData = sprite;
    b2Body *body = world->CreateBody(&bodyDef);

    b2CircleShape circleShape;
    circleShape.m_radius = (26.0 / PTM_RATIO);

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &circleShape;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.2f;
    fixtureDef.restitution = 0.8f;
    body->CreateFixture(&fixtureDef);
}

私は周りを見回してきましたが、本当の答えを見つけることができません (すべてのサンプル コードがこのようにエラーなしで CCPhysicsSprite を使用しているため)。私はばかげた間違いを犯していると確信していますが、何か新しいことを学ぶときはそれが予想されると思います:P

ありがとうございます!

4

1 に答える 1

2

CCPhysicsSpriteスプライトの位置を設定する前に、本体を設定する必要があります。この行でクラッシュが発生すると思います。

sprite.position = point;

これを見るとCCPhysicsSprite、含まれているオブジェクトの値を常に使用するように position/setPosition をオーバーライドしていb2bodyます。したがって、実際にはその時点である b2body プロパティにアクセスしますnil→ クラッシュ。一般に、CCPhysicsSprite を作成した後、できるだけ早くその .b2body を設定する必要があります。最初に .b2body プロパティを設定する必要があるという理由だけで、同様の問題が発生する機会がさらに増える可能性があります。

では、下に移動しsprite.position = point;ますsprite.b2Body = body;

于 2013-03-12T07:21:26.267 に答える