4

i have this code that gives me run time error in the line :

  body->CreateFixture(&boxDef) 

im using cocos2d-x 2.1.5 with box2d 2.2.1 in windows

CCSprite *sprite = CCSprite::create(imageName.c_str());
    this->addChild(sprite,1);

    b2BodyDef bodyDef;
    bodyDef.type = isStatic?b2_staticBody:b2_dynamicBody;
    bodyDef.position.Set((position.x+sprite->getContentSize().width/2.0f)/PTM_RATIO,
                         (position.y+sprite->getContentSize().height/2.0f)/PTM_RATIO);
    bodyDef.angle = CC_DEGREES_TO_RADIANS(rotation);
    bodyDef.userData = sprite;
    b2Body *body = world->CreateBody(&bodyDef);

    b2FixtureDef boxDef;
    if (isCircle)
    {
        b2CircleShape circle;
        circle.m_radius = sprite->getContentSize().width/2.0f/PTM_RATIO;
        boxDef.shape = &circle;
    }
    else
    {
        b2PolygonShape box;
        box.SetAsBox(sprite->getContentSize().width/2.0f/PTM_RATIO, sprite->getContentSize().height/2.0f/PTM_RATIO);
        boxDef.shape = &box;
    }

    if (isEnemy)
    {
        boxDef.userData = (void*)1;
        enemies->insert(body);

    }

    boxDef.density = 0.5f;
    body->CreateFixture(&boxDef)  //<-- HERE IS THE RUN TIME ERROR 

;

when i debug the box2d code im getting to b2Fixture.cpp in the method :

void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)

in the line :

m_shape = def->shape->Clone(allocator);

getting the runtime error :

R6025 pure virtual function call

4

1 回答 1

9

棘手的一个。我自己遇到过几次。它与变量范围有关。

boxDef.shape 是问题所在。您将形状创建为 if/else 块中的局部变量,然后将它们分配给 boxDef。一旦执行离开 if/else 块范围,这些局部变量将是垃圾。boxDef.shape 现在指向释放的内存。

解决方案是通过在 if/else 块之前移动圆形和框形声明来将形状变量保持在范围内。

于 2013-10-15T10:57:00.220 回答