2012-04-17 63 views
0

爲什麼CCSpriteBatchNode未明確與CCAnimation一起使用?相反,我們使用以下內容:(而不是將每個圖像的batchNode,讓batchNode打印這些圖像,代碼只使用spriteFrameByName):爲什麼CCAnimation不使用CCSpriteBatchNode來打印其圖像?

CCSpriteBatchNode *chapter2SpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"scene1atlas.png"]; 
CCSprite *vikingSprite = [CCSprite spriteWithSpriteFrameName:@"sv_anim_1.png"]; 
[chapter2SpriteBatchNode addChild:vikingSprite]; 


// Animation example with a CCSpriteBatchNode 
CCAnimation *exampleAnim = [CCAnimation animation]; 
    [exampleAnim addFrame: 
    [[CCSpriteFrameCache sharedSpriteFrameCache] 
    spriteFrameByName:@"sv_anim_2.png"]]; 

謝謝您的回答

回答

0

一個batchNode只是一個紋理繪製人工製品...對紋理包含的幀沒有任何瞭解,也不知道它是否將多個「邏輯」文件嵌入到單個紋理中。您必須創建該關聯,通常通過將spriteFrame添加到spriteFrameCache中,每個spriteFrame提供有關batchNode的「片段」的元數據。下面是我的遊戲之一的例子:

-(void) setupIdleAnimation{ 

    [self setupAnimations]; 
    NSString* animationName = @"Idle"; 
    NSString* framesFileName = [self getPlistFileNameForAction:animationName]; 
    CCSpriteBatchNode *bn = [CCSpriteBatchNode batchNodeWithFile:[self getTextureFileNameForAction:animationName]]; 
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:framesFileName texture:bn.texture]; 

// create array of frames for the animation 

    self.idleBatchNode=bn; 

    NSMutableArray *animFrames = [NSMutableArray array]; 
    for(NSUInteger i = 1; i <= 8; ++i) { 

     NSString *sfn = [self getFrameNameForAnimation:animationName 
            andFrameNumber:i]; 

     CCSpriteFrame *sf = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:sfn]; 
     if(sf) { 
      [animFrames insertObject:sf atIndex:i-1]; 
     } else { 
      CCLOGERROR(@"%@<setupIdleAnimation> : *** Sprite frame named [%@] not found in cache, bailing out.",self.class,sfn); 
      return; 
     } 
    } 


    CCAnimation *anim=[CCAnimation animationWithFrames:walkAnimFrames delay:ANIM_FRAME_DELAY]; 
    [animFrames removeAllObjects]; 
    anim.name=animationName; 

    self.idleAction = [CCRepeatForever 
        actionWithAction:[CCAnimate actionWithAnimation:anim 
               restoreOriginalFrame:NO]] ; 

    self.idleSprite = [CCSprite spriteWithSpriteFrameName:[self getFrameNameForAnimation:animationName 
                     andFrameNumber:1]]; 
    self.idleSprite.visible=NO; 
    [self.idleBatchNode addChild:self.idleSprite]; 
} 

所以我在的.plist已經準備了一個說明每一幀位於質地,這些定義添加到幀緩存中的數據。 batchNode說每一個是一個容器,將優化渲染性能。在上面的例子中,它非常適合單獨的紋理嵌入了16個字符類的空閒子畫面,這些字符類可以同時查看和怠速。

你可以找到this tutorial.

+0

感謝YvesLeBorg的回答很好的介紹和鏈接;)我更好地理解它是如何工作的,但是:我們可以在'CCSprite'實例添加到批次節點,但我們無法傳遞給它'CCAnimation'實例?兩者都包含「幀」,所以都應該使用相同的技術來優化渲染性能?感謝 – Paul 2012-04-18 00:07:41

+0

關於性能,閱讀安德魯的答案在這裏http://stackoverflow.com/questions/10234570/suitability-of-using-core-animation-on-ios-vs-using-cocos2d-and-opengl-es – YvesLeBorg 2012-04-20 11:19:04