我正在用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?什么可能出错?如果需要,我可以提供更多细节/代码。
答案 0 :(得分:0)
由于此sprite位于物理主体的userData中,因此当从cocos2d节点层次结构中删除sprite时,将不会清除userdata字段,从而留下悬空指针。使用正文检查精灵的任何出现,当从节点层次结构中删除时,或者当通过将userdata设置为NULL而解除分配并未将其自身与其身体断开时,实际上并不会将其物理主体从世界中移除,因为它可能应该在这种情况。