我可以在CCAnimation中使用blendFunc吗?

时间:2014-02-25 09:22:45

标签: ios iphone cocos2d-iphone

最近,我需要在blendFunc中使用CCSprite来改善我应用的视觉效果。但我不知道如何在CCAnimation中使用它。这是我的实施:

CCSprite * test=[CCSprite node];
test.position=CGPointMake(100, 200);
test.scale=3;
test.blendFunc=(ccBlendFunc){GL_SRC_ALPHA, GL_ONE};//it's not working
[scene addChild:test];

self.textureArray=[[NSMutableArray alloc]init];

for(int x=0;x<=18;x++){        
   [self.textureArray addObject:[CCSpriteFrame frameWithTextureFilename:[NSString stringWithFormat:@"skill_01_%d.png",x] rect:CGRectMake(0, 0, 91, 61)]];      
}

CCAnimation * animation=[CCAnimation animationWithSpriteFrames:self.textureArray delay:0.1];

[test runAction:[CCAnimate actionWithAnimation:animation]];

blendFuc不适用于此情况,只有CCSprite可以设置blendFunc。如果我需要动画中的所有帧都有blendFunc的效果,我该怎么办?

顺便说一句,我尝试使用计时器手动设置框架动画:

self.skllTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(animating:) userInfo:nil repeats:YES];

-(void)animating:(NSTimer *)t{

    CCSprite * tesx=[self.textureArray objectAtIndex:f];//f is a increasing value   
    CCSprite * ok =[CCSprite spriteWithTexture:tesx.texture];
    ok.blendFunc=(ccBlendFunc){GL_SRC_ALPHA, GL_ONE};
    [self.aniLayer removeAllChildrenWithCleanup:NO];
    [self.aniLayer addChild:ok];

}

我以这种方式获得了我想要的东西,但它没有效率,我认为必须有更好的方法来实现它。

感谢。

更新

我发现它是由

引起的
-(void) updateBlendFunc
{
    NSAssert( ! _batchNode, @"CCSprite: updateBlendFunc doesn't work when the sprite is rendered using a CCSpriteBatchNode");

    // it is possible to have an untextured sprite
    if( !_texture || ! [_texture hasPremultipliedAlpha] ) {
        _blendFunc.src = GL_SRC_ALPHA;
        _blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
        [self setOpacityModifyRGB:NO];
    } else {
        _blendFunc.src = CC_BLEND_SRC;//here
        _blendFunc.dst = CC_BLEND_DST;//and here
        [self setOpacityModifyRGB:YES];
    }


}

每当CCSprite更新它的displayFrame时,此函数将更改它自己的_blendFunc。我不知道为什么会这样,但在我删除以下两行之后:

//_blendFunc.src = CC_BLEND_SRC;//here
//_blendFunc.dst = CC_BLEND_DST;//and here

问题解决了。我可以像这样修复cocos2d吗?我希望我的改变不会造成任何错误。 请有人告诉我一个确切的答案。非常感谢。

1 个答案:

答案 0 :(得分:1)

您的第一个代码段不起作用,因为您创建的精灵没有任何纹理,如果没有与之关联的纹理,CCSprite不会更新blendFunc。你应该做的就是这个。

// add sprite frames to the sprite frame cache
CCSprite *sprite = [CCSprite spriteWithSpriteFrame:spriteFramesArra[0]];
sprite.blendFunc = newBlendFunc;
[sprite runAnimation:animation];

由于动画帧使用相同的纹理,并且在动画运行后将纹理与其关联后我们在精灵上设置了所需的纹理,因此它将被正确设置和更新。