0

为什么CCSpriteBatchNode不明确使用 with CCAnimation?相反,我们使用以下内容:(而不是将每个图像添加到 batchNode 并让 batchNode 打印这些图像,代码仅使用spriteFrameByName):

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"]];

感谢您的回答

4

1 回答 1

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 个字符类嵌入空闲精灵的纹理,这些字符类通常同时处于视图和空闲状态。

您可以在本教程中找到很好的介绍。

于 2012-04-17T22:28:05.987 回答