Recently I need improve my visual effect of my app by using blendFunc
in CCSprite
. But I don't know how to use it in CCAnimation
. Here is my implementation:
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]];
But the blendFuc
is not working for this case, and only CCSprite
can set blendFunc
. What can I do if I need all the frames in my animation has the blendFunc's effect?
By the way, I tried to use a timer to animate the frames manually:
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];
}
I get what I want in this way, but it's not effecient, I think there must be some better way to do it.
Thanks.
UPDATE
I've found that it's caused by
-(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];
}
}
Every time when CCSprite updates it's displayFrame, this function will change it's own _blendFunc. I don't know why it's like this, but after I removing the following two lines:
//_blendFunc.src = CC_BLEND_SRC;//here
//_blendFunc.dst = CC_BLEND_DST;//and here
The problem solved. Can I fix cocos2d like this? I hope there is no bug caused by my change. Please someone tell me an exact answer. Thanks a lot.