2013-10-15 1 views
4

Je possède ce code qui me donne le temps de courir erreur dans la ligne:CreateFixture box2d avec b2FixtureDef donne pur appel de fonction virtuelle

body->CreateFixture(&boxDef) 

im en utilisant cocos2d-x 2.1.5 avec box2d 2.2.1 dans les fenêtres

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 

;

lorsque i déboguer le code box2d im obtenir à b2Fixture.cpp dans le procédé:

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

dans la ligne:

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

obtenir l'erreur d'exécution:

Appel de fonction virtuelle pure R6025

Répondre

9

Tricky un. Je suis tombé sur moi-même plusieurs fois. Cela a à voir avec la portée variable.

Le paramètre boxDef.shape est le problème. Vous créez les formes en tant que variables locales dans les blocs if/else, puis vous les affectez à boxDef. Dès que l'exécution quitte la portée du bloc if/else, ces variables locales seront corrompues. Le boxDef.shape pointe maintenant vers la mémoire libérée.

La solution consiste à conserver les variables de forme dans la portée en déplaçant les déclarations de forme de cercle et de boîte avant le bloc if/else.

+0

Merci à vous !!! aimez votre travail! – user63898

Questions connexes