【问题标题】:Cocos2d-iPhone with Box2D: CCPhysicsSprite EXC_BAD_ACCESSCocos2d-iPhone 与 Box2D:CCPhysicsSprite EXC_BAD_ACCESS
【发布时间】:2013-03-10 20:53:34
【问题描述】:

我最近才开始搞乱 cocos2d 的 Box2D 集成,虽然大部分过程都很简单直接,但在使用 CCPhysicsSprite(将 b2body 与 sprite 集成的 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,因为将 CCPhysicsSprite 更改为 CCSprite 会引发零错误:

- (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

提前致谢!

【问题讨论】:

  • 哪一行给出了错误的访问权限?
  • b2body中的方法inline float32 b2Body::GetAngle() const,具体返回m_sweep.a;
  • 但只有在 CCPhysicsSprite 上使用 b2body 时,否则 b2body 不会抛出错误
  • 您发布的代码中没有调用 b2Body::GetAngle()。
  • 看,您发布的代码没有显示崩溃发生的位置。

标签: objective-c cocos2d-iphone box2d objective-c++


【解决方案1】:

对于CCPhysicsSprite,您必须在设置精灵位置之前设置主体。 我假设这条线是发生崩溃的地方:

sprite.position = point;

如果您查看CCPhysicsSprite,它会覆盖位置/setPosition 以始终使用包含的b2body 对象中的值。所以它真正访问了它的 b2body 属性,此时为 nil → Crash。 通常,在创建 CCPhysicsSprite 后,您希望尽快设置其 .b2body - 可能会出现更多类似的问题,因为您需要先设置 .b2body 属性。

所以,将sprite.position = point; 移动到sprite.b2Body = body; 下方。

【讨论】:

  • 另外,您必须在设置位置之前将 PTM_RATIO 传递给 CCPhysicsSprite:physicsSprite.PTM_RATIO = ...;
  • 没错。这是我花了几个小时爬上去的另一个陷阱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多