Добавление UIImage в CCSprite с помощью Box2D - PullRequest
3 голосов
/ 28 июля 2011

Я хочу добавить изображение в CCSprite, а затем использовать его в своем мире Box2d.createBoxAtLocation правильно подбирает contentSize, но никогда не отображает изображение ... что я делаю не так?Нужно ли что-нибудь добавить в функцию update ()?

    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);    
    }

EDIT

Внутри функции обновления у меня есть это, но это вызывает ошибку EXC_BAD_ACCESS 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);
       }       
   }

1 Ответ

2 голосов
/ 28 июля 2011

Спрайт не добавляется addChild в любой CCNode (CCLayer или CCScene и т. Д.)?

Если это так,

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

спрайт может быть освобожден в update (), потому чтоспрайт является автоматически выпущенным объектом.

В этом случае вы должны сохранить спрайт в CreateBody,

body->SetUserData([_sprite retain]);

, а затем отпустить его в DestroyBody.

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

BTWЯ рекомендую вам использовать CCBox2D.

РЕДАКТИРОВАНИЕ:

Вы добавили Child sprite в свою CCScene или дочерние узлы?

[self addChild:sprite];

Или положение тела (loc1)в диапазоне экрана?

...