私はつい最近、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
ありがとうございます!