cocos2d-x细节之自绘图形透明度问题
来源:互联网 发布:淘宝访客来源根据 编辑:程序博客网 时间:2024/05/17 05:54
多张图片混合成一张图片(alpha)
CCImage* body = new CCImage(); body->initWithImageFile("b.png", CCImage::kFmtPng); CCImage* cloth = new CCImage(); cloth->initWithImageFile("y.png", CCImage::kFmtPng); CCImage* hair = new CCImage(); hair->initWithImageFile("t.png", CCImage::kFmtPng); unsigned char *bData = body->getData(); unsigned char *cData = cloth->getData(); unsigned char *hData = hair->getData(); int iIndex = 0; for (int i = 0; i < body->getHeight(); i ++) { for (int j = 0; j < body->getWidth(); j ++) { int iBPos = iIndex; unsigned int bodyB = bData[iIndex]; unsigned int clothB = cData[iIndex]; unsigned int hairB = hData[iIndex]; iIndex ++; unsigned int bodyG = bData[iIndex]; unsigned int clothG = cData[iIndex]; unsigned int hairG = hData[iIndex]; iIndex ++; unsigned int bodyR = bData[iIndex]; unsigned int clothR = cData[iIndex]; unsigned int hairR = hData[iIndex]; iIndex ++; unsigned int bodyA = bData[iIndex]; unsigned int clothA = cData[iIndex]; unsigned int hairA = hData[iIndex]; iIndex ++; //身体和衣服混合 bodyB = clothB*(clothA/255.f) + ((255.f-clothA)/255.f)*bodyB; bodyG = clothG*(clothA/255.f) + ((255.f-clothA)/255.f)*bodyG; bodyR = clothR*(clothA/255.f) + ((255.f-clothA)/255.f)*bodyR; bodyA =((clothA/255.f)*(clothA/255.f)+((255.f-clothA)/255.f)*(bodyA/255.f))*255.f; //身体和衣服混合后,再和头发混合 bodyB = hairB*(hairA/255.f) + ((255.f-hairA)/255.f)*bodyB; bodyG = hairG*(hairA/255.f) + ((255.f-hairA)/255.f)*bodyG; bodyR = hairR*(hairA/255.f) + ((255.f-hairA)/255.f)*bodyR; bodyA =((hairA/255.f)*(hairA/255.f)+((255.f-hairA)/255.f)*(bodyA/255.f))*255.f; //结果值 bData[iBPos] = (unsigned char)bodyB; bData[iBPos + 1] = (unsigned char)bodyG; bData[iBPos + 2] = (unsigned char)bodyR; bData[iBPos + 3] = (unsigned char)bodyA; } } CCTexture2D* texture = new CCTexture2D; texture->initWithImage(body); CCSprite* bSprite = CCSprite::spriteWithTexture(texture); bSprite->setPosition(ccp(240,150)); addChild(bSprite, 1); body->release(); cloth->release(); hair->release(); texture->release();
其实就一个公式:
目标值 = 上图alpha值*上图值 + (1-上图alpha值)*下图值 alpha = [0, 1];
cocos2d-x细节之自绘图形透明度问题
如若重载CCSprite的draw函数,记得设置blend混合模式,默认是没有透明度的。
示例如下:
void draw()
{
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //cocos2d默认混合模式
//根据圆的半径来计算分割份数,一般够用
ccDrawColor4F(color.r, color.g, color.b, color.a);
ccDrawSolidArc(CCPointZero, radius, radius*10, radsrc/180*M_PI, raddest/180*M_PI); //注意这里用坐标(0,0)!
}
如果没有glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),绘制的图形就不会有透明效果!
CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案。ccBlendFunc包含了一个src和一个dst,分别表示目标和源的运算因子。
混合后的RGBA为:(Rs*N_Rs+ Rd* N_Rd,Gs*N_Gs+ Gd* N_Gd,
- cocos2d-x细节之自绘图形透明度问题
- cocos2d-x细节之自绘图形透明度问题
- Cocos2d-x讲解之绘图API
- cocos2d-x 游戏开发新手细节问题
- cocos2d-x 游戏开发新手细节问题
- cocos2d-x 游戏开发新手细节问题
- COCOS2D-X 快速熟悉LUA细节问题
- COCOS2D-X 快速熟悉LUA细节问题
- COCOS2D-X 快速熟悉LUA细节问题
- COCOS2D-X 快速熟悉LUA细节问题
- COCOS2D-X 快速熟悉LUA细节问题
- Cocos2d-x 常见细节问题总结 1
- [寒江孤叶丶的Cocos2d-x之旅_19]Cocos2d-x 3.0 rc2 版本 Label 的setOpacity 函数失效,无法设置透明度问题的解决办法
- 【玩转cocos2d-x之三十四】绘图:CCDrawingPrimitives和CCDrawNode
- 【玩转cocos2d-x之三十四】绘图:CCDrawingPrimitives和CCDrawNode
- cocos2d-x 快速熟悉Lua基本细节问题
- cocos2d-x 快速熟悉Lua基本细节问题
- cocos2d-x 快速熟悉Lua基本细节问题
- java计算大数据阶乘
- CI框架(五)单一入口文件index.php分析
- RHEL 6.3 U盘启动
- Spring编程式事务详解
- 直接拿来用!最火的Android开源项目(一)
- cocos2d-x细节之自绘图形透明度问题
- lniux程序员常用命令
- 一步步学习SPD2010--第十章节--SP网站品牌化(9)--理解SP的CSS继承
- 项目中学到的做事做人的道理
- 【opencv】访问mat元素
- Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
- 广州.Net培训价格最便宜的是那家?
- linux 模块编译步骤
- html5中关于input用法的改变