CCSprite不是NULL。但无法访问属性。

时间:2014-01-25 20:30:57

标签: android c++ eclipse box2d cocos2d-x

我正在用box2d建立一个cocos2dx游戏。一切正常,除非我在Android设备上部署应用程序时,当我重新启动一次关卡时游戏崩溃。由于我无法在eclipse上进行调试,因此使用CCLogs我已设法找到崩溃发生的确切行。这是代码..

void GameLayer::update(float dt)
{

    int velocityIterations = 8;
    int positionIterations = 1;
    CCLog("1 bodycount %d",world->GetBodyCount());
    world->Step(dt, velocityIterations, positionIterations);

    for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) { 
        //CCLog("Counter %d",counter);
        if (b->GetUserData() != NULL) {
            CCLog("1.5");
            CCSprite *sprite = (CCSprite *)b->GetUserData(); 
            CCLog("2");
            sprite!=NULL?CCLog("sprite not null"):CCLog("sprite is null");
            CCLog("2.1");
            CCLog("3 sprite tag:%d",sprite->getTag());
            sprite->setPosition( ccp(b->GetPosition().x * PTM_RATIO,
                                    b->GetPosition().y * PTM_RATIO));
            sprite->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));


            //......more code.....


        }
    }
}

这是更新循环,其中box2d正文得到更新。 CCLog("2.1")之前的行我得到sprite not null。但在那之后,当我尝试打印精灵的标签(CCLog("3 sprite tag:%d",sprite->getTag());)时,它会崩溃。在logcat中我得到Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 30903 (Thread-2408)

这是不是意味着CCSprite为NULL?什么可能出错?如果需要,我可以提供更多细节/代码。

1 个答案:

答案 0 :(得分:0)

由于此sprite位于物理主体的userData中,因此当从cocos2d节点层次结构中删除sprite时,将不会清除userdata字段,从而留下悬空指针。使用正文检查精灵的任何出现,当从节点层次结构中删除时,或者当通过将userdata设置为NULL而解除分配并未将其自身与其身体断开时,实际上并不会将其物理主体从世界中移除,因为它可能应该在这种情况。