2013-03-29 2 views
1

Я делаю игру в cocos2d, у меня есть цыпленок, как персонаж, использующий CCSprite. Этот цыпленок имеет несколько изображений, делающих разные движения.Как переключить спрайт между разными сторонами CCSpriteBatchNode в cocos2d

Есть так много изображений для движений, что я должен использовать несколько файлов plist для спрайта.

Моя проблема заключается в том, что я могу переключаться между дифферент спрайтов

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: 
    @"chicken-1to3.plist"]; 

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: 
    @"chicken-4to5.plist"]; 

    spriteSheet1to3 = [CCSpriteBatchNode 
             batchNodeWithFile:@"chicken-1to3.png"]; 
    spriteSheet4to5 = [CCSpriteBatchNode 
             batchNodeWithFile:@"chicken-4to5.png"]; 
    [self addChild:spriteSheet1to3 z:1]; 
    [self addChild:spriteSheet4to5 z:2]; 

    NSMutableArray *chickenManAni1Imgs = [NSMutableArray array]; 
    NSMutableArray *chickenManAni2Imgs = [NSMutableArray array]; 
    NSMutableArray *chickenManAni3Imgs = [NSMutableArray array]; 
    NSMutableArray *chickenManAni4Imgs = [NSMutableArray array]; 
    NSMutableArray *chickenManAni5Imgs = [NSMutableArray array]; 

    for(int i = 1; i <= 9; ++i) { 
     [chickenManAni1Imgs addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"chicken-1-%d.png", i]]]; 
    } 
    for(int i = 1; i <= 19; ++i) { 
     [chickenManAni2Imgs addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"chicken-2-%d.png", i]]]; 
    } 
    for(int i = 1; i <= 21; ++i) { 
     [chickenManAni3Imgs addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"chicken-3-%d.png", i]]]; 
    } 
    for(int i = 1; i <= 16; ++i) { 
     [chickenManAni4Imgs addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"chicken-4-%d.png", i]]]; 
    } 
    for(int i = 1; i <= 36; ++i) { 
     [chickenManAni5Imgs addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
      [NSString stringWithFormat:@"chicken-5-%d.png", i]]]; 
    } 

    chickenManAni1 = [CCAnimation 
        animationWithSpriteFrames:chickenManAni1Imgs delay:0.04f]; 
    chickenManAni2 = [CCAnimation 
         animationWithSpriteFrames:chickenManAni2Imgs delay:0.04f]; 
    chickenManAni3 = [CCAnimation 
         animationWithSpriteFrames:chickenManAni3Imgs delay:0.04f]; 
    chickenManAni4 = [CCAnimation 
         animationWithSpriteFrames:chickenManAni4Imgs delay:0.04f]; 
    chickenManAni5 = [CCAnimation 
         animationWithSpriteFrames:chickenManAni5Imgs delay:0.04f]; 

    chickenMan = [CCSprite spriteWithSpriteFrameName:@"chicken-5-1.png"]; 
    chickenMan.position = ccp(winSize.width/2, winSize.height/2); 

    [spriteSheet4to5 addChild:chickenMan]; 

    [chickenMan runAction:[CCRepeatForever actionWithAction: 
          [CCAnimate actionWithAnimation:chickenManAni5 restoreOriginalFrame:NO]]]; 
    chickenManAniRunning = 1; 

Вот код, когда я пытаюсь изменить спрайт

 [chickenMan stopAllActions]; 
     [spriteSheet4to5 removeChild:chickenMan cleanup:YES]; 
     [spriteSheet1to3 addChild:chickenMan]; 

     [chickenMan runAction:[CCRepeatForever actionWithAction: 
           [CCAnimate actionWithAnimation:chickenManAni2 restoreOriginalFrame:NO]]]; 

После этого я получаю эту ошибку: ' CCSprite не использует один и тот же идентификатор текстуры '

ОБНОВЛЕНИЕ: Я использую два Differents спрайтов:

chickenMan1to3 = [CCSprite spriteWithSpriteFrameName:@"chicken-1-1.png"]; 
    chickenMan1to3.position = ccp(winSize.width/2, winSize.height/2); 
    [chickenMan1to3 setVisible:YES]; 

    chickenMan4to5 = [CCSprite spriteWithSpriteFrameName:@"chicken-5-1.png"]; 
    chickenMan4to5.position = ccp(winSize.width/2, winSize.height/2); 
    [chickenMan4to5 setVisible:NO]; 

И я включаю их так:

 [chickenMan1to3 stopAllActions]; 
     [chickenMan1to3 setVisible:NO]; 
     [chickenMan4to5 setVisible:YES]; 
     [chickenMan4to5 runAction:[CCRepeatForever actionWithAction: 
            [CCAnimate actionWithAnimation:chickenManAni4 restoreOriginalFrame:NO]]]; 

ответ

3

использовать два спрайты, по одному для каждого пакетного узла. При переключении на анимацию из другого пакетного узла, установите анимационный спрайт видимым и скройте другой. Чтобы заставить их оживить синхронизацию, добавьте оба спрайта в ccnode, который затем будет представлять ваш цыпленок в зависимости от позиции, действий и другой логики.

Если цыпленок является единственным ребенком спрайта в пакетном узле, вы можете просто удалить пакетный узел, поскольку пакетная обработка помогает только в том случае, если у вас есть несколько экземпляров одного и того же спрайта и текстуры.

+0

LearnCocos2D, большое вам спасибо !, Теперь у меня счастливая танцевальная курица. Когда вы сказали «удалить пакетный узел», вы не хотите удалять строку «[self addChild: spriteSheet1to3 z: 1];» и используйте "[self addChild: chickenMan1to3];"? – Tony

+0

И также удалите "CCSpriteBatchNode batchNodeWithFile". – Tony

+1

Да, без спрайта. Если каждый пакетный узел имеет только одного ребенка, он просто мешает. – LearnCocos2D

Смежные вопросы