Search code examples
cocos2d-iphonebox2dspriteccsprite

Box2D body with animating sprite sheet plist


I have created an animating sprite using CCSpriteBatchNode and CCSprite. I use plist to get frames. Here is the code I put it in init().

//================== making animating sprite
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"framelist.plist"];
    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode 
                                      batchNodeWithFile:@"frames.png"];
    [self addChild:spriteSheet];

    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    for(int i = 1; i <= 2; ++i) {
        [walkAnimFrames addObject:
         [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
          [NSString stringWithFormat:@"frame%d.png", i]]];
    }

    CCAnimation *walkAnim = [CCAnimation 
                             animationWithFrames:walkAnimFrames delay:0.1f];
    //_frameSprite is CC Sprite

    _frameSprite = [CCSprite spriteWithBatchNode:spriteSheet 
                                      rect:CGRectMake(0,0,48,48)];
    _frameSprite.position = ccp(winSize.width + 60, winSize.height/2);
    _flyAction = [CCRepeatForever actionWithAction:
                  [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
    [_frameSprite runAction:_flyAction];
    [spriteSheet addChild:_frameSprite];

Once the sprite is ready and running on screen I created b2BodyDef and assign b2Body (i.e. frameBodyDef, frameBody) my sprite as shown below.

b2BodyDef frameBodyDef;
    frameBodyDef.type = b2_staticBody;
    frameBodyDef.position.Set(160/PTM_RATIO, 200/PTM_RATIO);
    frameBodyDef.userData = _frameSprite;
    frameBody = _world->CreateBody(&frameBodyDef);

After creating the body, when build and ran, the program crashes at line

frameBody = _world->CreateBody(&frameBodyDef);

Saying BAD ACCESS.

Please kindly help me out in this, why the animating sprite cannot be added to the body???

Thank you.


Solution

  • Here is the solution I figure it out.

    If you make sprite sheet from plist and want your animation sheet to add to the body make sure first add your sprite object to the body then add the sprite to the sheet.

    here is the right code

    //================== making animating sprite
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"framelist.plist"];
    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode 
                                      batchNodeWithFile:@"frames.png"];
    [self addChild:spriteSheet];
    
    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    for(int i = 1; i <= 2; ++i) {
        [walkAnimFrames addObject:
         [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
          [NSString stringWithFormat:@"frame%d.png", i]]];
    }
    
    CCAnimation *walkAnim = [CCAnimation 
                             animationWithFrames:walkAnimFrames delay:0.1f];
    //_frameSprite is CC Sprite
    
    _frameSprite = [CCSprite spriteWithBatchNode:spriteSheet 
                                      rect:CGRectMake(0,0,48,48)];
    _frameSprite.position = ccp(winSize.width + 60, winSize.height/2);
    _flyAction = [CCRepeatForever actionWithAction:
                  [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
    [_frameSprite runAction:_flyAction];
    
    b2BodyDef frameBodyDef;
    frameBodyDef.type = b2_staticBody;
    frameBodyDef.position.Set(160/PTM_RATIO, 200/PTM_RATIO);
    frameBodyDef.userData = _frameSprite;  //================first add the sprite to body
    frameBody = _world->CreateBody(&frameBodyDef);
    
    [spriteSheet addChild:_frameSprite];  //======second add sprite to the sheet