• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 我可以在 CCAnimation 中使用 blendFunc 吗?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 19:29:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

最近我需要通过在 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 selectorselector(animating userInfo:nil repeats:YES];

-(void)animatingNSTimer *)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 addChildk];

}

我通过这种方式得到了我想要的,但是效率不高,我认为必须有更好的方法来做到这一点。

谢谢。

更新

我发现这是由于

-(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吗?我希望我的更改不会引起错误。 请有人告诉我一个确切的答案。非常感谢。



Best Answer-推荐答案


您的第一个代码片段将不起作用,因为您创建的 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap