2011-07-28 55 views
3

我想将图像添加到CCSprite,然后在我的Box2d世界中使用它。 createBoxAtLocation正确拾取contentSize,但从不显示图像...我做错了什么?我需要添加任何东西到update()函数吗?使用Box2D将UIImage添加到CCSprite

CCSprite *sprite = [CCSprite spriteWithFile:@"slider_piece.png"]; 

    [self createBoxAtLocation:loc1 withSize:boxSize forSprite:sprite]; 


    -(void) createBoxAtLocation:(CGPoint)location withSize:(CGSize)size forSprite:(CCSprite *)_sprite 
    { 
     b2BodyDef bodyDef; 
     bodyDef.type = b2_dynamicBody; 
     bodyDef.position = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO); 
     bodyDef.allowSleep = false; 
     //bodyDef.userData = _sprite; 

     b2Body *body = world->CreateBody(&bodyDef); 
     body->SetUserData(_sprite); 

     b2FixtureDef fixtureDef; 

     b2PolygonShape shape; 
     shape.SetAsBox(_sprite.contentSize.width/2/PTM_RATIO, _sprite.contentSize.height/2/PTM_RATIO); 
     fixtureDef.shape = &shape; 

     body->CreateFixture(&fixtureDef);  
    } 

编辑

里面的更新功能我有这个,但它会导致对sprite.position线

for(b2Body *b = world->GetBodyList(); b != NULL; b = b->GetNext()) 
    {  
     if (b->GetUserData() != NULL) { 
      CCSprite *sprite = (CCSprite *) b->GetUserData(); 
      sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); 
      sprite.rotation = CC_RADIANS_TO_DEGREES(b->GetAngle() * -1); 
     }  
    } 

回答

2

的精灵不addChild'ed到EXC_BAD_ACCESS错误任何CCNode(CCLayer或CCScene等)?

如果是这样,

CCSprite *sprite = [CCSprite spriteWithFile:@"slider_piece.png"]; 

精灵可能在更新(),因为精灵会被自动释放对象被释放。

您必须保留精灵在这种情况下,在CreateBody,

body->SetUserData([_sprite retain]); 

然后在DestroyBody释放。

[(CCSprite *)body->GetUserData() release]; 

顺便说一句,我建议你使用CCBox2D。

编辑:

你有没有的AddChild精灵您CCScene或子节点?

[self addChild:sprite]; 

或身体的位置(LOC1)是在屏幕范围内?

+0

谢谢Kazuki,保留停止了EXC_BAD_ACCESS错误。但图像仍未显示。 – daidai

+0

更新了我的答案。 –

+0

谢谢,这样做! [(CCSprite *)body-> GetUserData()release];走? – daidai

相关问题