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 个字符类嵌入空闲精灵的纹理,这些字符类通常同时处于视图和空闲状态。
您可以在本教程中找到很好的介绍。