Корпус Box2D с листом анимации спрайта - PullRequest
1 голос
/ 23 августа 2011

Я создал анимирующий спрайт, используя CCSpriteBatchNode и CCSprite. Я использую plist для получения кадров. Вот код, который я положил в 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];

Как только спрайт готов и запущен на экране, я создал b2BodyDef и назначил b2Body (то есть frameBodyDef, frameBody) мой спрайт, как показано ниже.

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

После создания тела, при сборке и запуске программа вылетает в строке

frameBody = _world->CreateBody(&frameBodyDef);

Говоря ПЛОХОЙ ДОСТУП.

Пожалуйста, помогите мне в этом, почему оживляющий спрайт не может быть добавлен в тело ???

Спасибо.

1 Ответ

1 голос
/ 24 августа 2011

Вот решение, которое я понял.

Если вы создаете спрайт-лист из plist и хотите, чтобы ваш лист анимации добавлялся в тело, сначала добавьте объект спрайта в тело, а затем добавьте спрайт на лист.

вот правильный код

//================== 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
...