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