Cocos2d iphone cocos2d box2d精灵位置崩溃

Cocos2d iphone cocos2d box2d精灵位置崩溃,cocos2d-iphone,Cocos2d Iphone,我有以下代码: for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *itemSprite = (CCSprite*)b->GetUserData(); CGSize SpriteSize; SpriteSize.height

我有以下代码:

for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
    if (b->GetUserData() != NULL) 
    {               
        CCSprite *itemSprite = (CCSprite*)b->GetUserData();
        CGSize SpriteSize;
        SpriteSize.height = itemSprite.contentSize.height;
        SpriteSize.width = itemSprite.contentSize.width;
        CGPoint SpritePosition=[itemSprite position];           
    }
}
只需获取sprite的位置,但此程序有时会在以下情况下崩溃:

SpriteSize.height = itemSprite.contentSize.height;
这一行:

CGPoint SpritePosition=[itemSprite position];
我正在使用cocos2d.99.5

编辑:
这是我的崩溃日志:

异常类型:EXC\U坏访问(SIGBUS) 异常代码:在0x0000000f时内核保护失败 崩溃线程:0


由于您没有发布崩溃转储或堆栈跟踪,我只能猜测。至少有两个原因:

  • 将多个类的对象分配给
    body->SetUserData()
    。当您将用户数据强制转换为CCSprite,而实际上它不是CCSprite时,就会发生崩溃。尽管我怀疑这种情况,因为人们通常会将同一类的对象分配给它

  • 第二个原因更可能发生,因为人们通常依赖CCLayer来保留其CCSprite子对象(而不是明确地保留它们)。从父CCLayer移除CCsprite时,后者将释放前者,如果retain count==0(很可能),则从堆中释放CCsprite。但是请记住,一些B2Body仍然通过用户数据属性持有指向这些CCSprite的指针?那么,当您遍历所有主体并尝试使用仍然附加到用户数据的已发布的ccsprite时会发生什么呢?撞车

  • 解决这一问题的方法是,当从CCSprite层中删除实体对应的精灵时,您需要删除实体,方法是将CCSprite子类化以添加指向b2Body的ivar,或者将两个对象(即精灵和实体)包装到另一个类中。然后添加代码以在精灵即将被解除分配时移除主体


    希望这有帮助。如果没有,请发布更多详细信息(崩溃转储或堆栈跟踪)。

    好吧,我们可以肯定的是,精灵被分配给了userData,后来被解除分配。我看到您指定的精灵是一个自动释放的对象,更可能意味着超出范围的精灵收到了释放消息。为了确保这是真的,请尝试按如下方式创建sprite:
    [[CCSprite alloc]initWithSprite:@“apple.png”]但请记住,以后必须释放它。

    如果它对你有效,使用上面的建议

    崩溃转储应该为您提供有关错误确切原因的一些有价值的信息。你能把它贴出来吗?我想,那具尸体上没有任何精灵。将通过body列表的迭代更改为如下内容是一个很好的做法:for(b2Body*body=world->GetBodyList();body!=nil;body=body->GetNext()){BodyNode*BodyNode=(BodyNode*)body->GetUserData();if(BodyNode!=NULL&&BodyNode.sprite!=nil){ .... }@gixdev:你的回答可能会有帮助……你能在这个问题的回答部分给出详细信息吗……我正在使用精灵……那么应该用什么来代替BodyNode呢?你能给出代码吗……我用两种方式声明精灵,并且这个精灵被分配给userdata……我需要这两种声明……monkey=[CCSprite SpriteWithPriteFrameName:@“BackMonkey_animation01_pad.png”];和fruits=[CCSprite spriteWithFile:[NSString stringWithFormat:@“Fruit%d_pad.png”;(arc4random()%(2-1+1)+1)];但它并没有按其应有的方式运行?好的,只是为了确保问题的原因是在释放对象时-尝试启动[[CCSprite alloc]InitWithPriteFrameName:frameName]
    Thread 0 Crashed:
    0   libobjc.A.dylib                 0x00002666 objc_msgSend_stret + 14
    1   ShootTheMonkey                  0x0004c066 -[LevelFour ccTouchBegan:withEvent:] (LevelFour.mm:1432)
    2   ShootTheMonkey                  0x00321bf0 -[CCTouchDispatcher touches:withEvent:withTouchType:] (CCTouchDispatcher.m:238)
    3   ShootTheMonkey                  0x00322454 -[CCTouchDispatcher touchesBegan:withEvent:] (CCTouchDispatcher.m:305)
    4   ShootTheMonkey                  0x003240ec -[EAGLView touchesBegan:withEvent:] (EAGLView.m:318)
    5   UIKit                           0x00053d72 -[UIWindow _sendTouchesForEvent:] + 254
    6   UIKit                           0x000536fe -[UIWindow sendEvent:] + 74
    7   UIKit                           0x0004f320 -[UIApplication sendEvent:] + 260
    8   UIKit                           0x0004ec8c _UIApplicationHandleEvent + 4772
    9   GraphicsServices                0x00003b2c PurpleEventCallback + 660
    10  CoreFoundation                  0x00022d96 CFRunLoopRunSpecific + 2214
    11  CoreFoundation                  0x000224da CFRunLoopRunInMode + 42
    12  GraphicsServices                0x000030d4 GSEventRunModal + 108
    13  GraphicsServices                0x00003180 GSEventRun + 56
    14  UIKit                           0x0000342a -[UIApplication _run] + 374
    15  UIKit                           0x00001954 UIApplicationMain + 636
    16  ShootTheMonkey                  0x0000377e main (main.m:13)
    17  ShootTheMonkey                  0x0000373c start + 32