- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我需要通过在 CCSprite
中使用 blendFunc
来改善我的应用程序的视觉效果。但是我不知道如何在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吗?我希望没有因我的更改而导致的错误。请有人告诉我一个确切的答案。非常感谢。
最佳答案
您的第一个代码片段不会起作用,因为您创建的 Sprite 没有任何纹理,如果没有与之关联的纹理,CCSprite 不会更新 blendFunc。你应该做的是这个。
// add sprite frames to the sprite frame cache
CCSprite *sprite = [CCSprite spriteWithSpriteFrame:spriteFramesArra[0]];
sprite.blendFunc = newBlendFunc;
[sprite runAnimation:animation];
由于动画帧使用相同的纹理,并且我们在将纹理与它关联后在 Sprite 上设置所需的纹理,一旦动画运行,它就会被正确设置和更新。
关于ios - 我可以在 CCAnimation 中使用 blendFunc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22009687/
我正在为两点之间直线上的每一步在每个像素处将 Sprite 绘制到帧缓冲区,但我在混合方面遇到了问题: 我目前正在使用: (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 然后,在我
我想做这样的事情: currentBlendFunc = glGetCurrentBlendFunc(); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_AL
最近我需要通过在 CCSprite 中使用 blendFunc 来改善我的应用程序的视觉效果。但是我不知道如何在CCAnimation中使用它。这是我的实现: CCSprite * test=[CCS
本文整理了Java中com.google.gwt.webgl.client.WebGLRenderingContext.blendFunc()方法的一些代码示例,展示了WebGLRenderingCo
我是一名优秀的程序员,十分优秀!