说说我自己想出的获取一个精灵对应的单色精灵的方法(将一个精灵中不透明部分的颜色全部变成单一颜色,单色精灵这个名字我自己随便取的)
上面的函数返回了一个白色的精灵,然后用setColor可以设置颜色,测试代码如下
- Sprite *getMonoColorSprite(Sprite *sprite)
- {
- auto size = sprite->getContentSize();
- auto anchorPoint = sprite->getAnchorPoint();
- auto position = sprite->getPosition();
- auto center = Vec2(size.width / 2,size.height / 2);
- //如果直接用sprite,renderTexture上下是反的
- //有时sprite的锚点和位置变了,renderTexture里的纹理是空的
- //所以创建一个临时的上下翻转的精灵
- auto temp = Sprite::createWithTexture(sprite->getTexture(),sprite->getTextureRect());
- temp->setPosition(center);
- temp->setFlippedY(true);
- auto mask = LayerColor::create(Color4B::WHITE,size.width,size.height);
- mask->setBlendFunc({ GL_DST_ALPHA,GL_ZERO });
- auto renderTexture = RenderTexture::create(size.width,size.height);
- renderTexture->setAnchorPoint(Vec2::ZERO);
- renderTexture->setPosition(Vec2::ZERO);
- renderTexture->begin();
- temp->visit();
- mask->visit();
- renderTexture->end();
- //用renderTexture里的纹理创建要返回的精灵
- auto tex = renderTexture->getSprite()->getTexture();
- auto spr = Sprite::createWithTexture(tex);
- //恢复到与sprite相同的锚点和位置
- spr->setAnchorPoint(anchorPoint);
- spr->setPosition(position);
- return spr;
- }
- auto sprite = Sprite::create("grossini.png");
- sprite->setPosition(100,200);
- auto mono = getMonoColorSprite(sprite);
- mono->setColor(Color3B::GREEN);
- mono->setPosition(300,200);
- addChild(sprite);
- addChild(mono);
有点像数字图像处理中的图像二值化,不过这里这有一种颜色
使用RenderTexture效率低下,而且要占用额外空间,图片多的话,可能会多占很多空间,这种方法不太实用,推荐使用下面的Shader实现
@H_301_4@
fsh文件如下
- #ifdef GL_ES
- precision lowp float;
- #endif
- varying vec4 v_fragmentColor;
- varying vec2 v_texCoord;
- void main()
- {
- vec4 texColor = texture2D(CC_Texture0,v_texCoord);
- <span style="white-space:pre"> </span>//最终颜色完全由顶点颜色决定
- gl_FragColor=v_fragmentColor;
- gl_FragColor.a*=texColor.a;
- }
使用方法
- //可以在游戏初始化加载Shader,并添加到<span style="font-family: Arial,Helvetica,sans-serif;">ShaderCache中,方便以后调用</span>
- auto fragmentSource = FileUtils::getInstance()->getStringFromFile("monocolor.fsh");
- auto shader_program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert,fragmentSource.c_str());
- ShaderCache::getInstance()->addGLProgram(shader_program,"monocolor");
- //应用使用Shader
- sprite->setGLProgram(ShaderCache::getInstance()->getGLProgram("monocolor"));
用Shader实现的代码少而且效率高,推荐使用