Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会
网上有一篇博客讲的是高亮的http://www.cnblogs.com/mrblue/p/3455775.html
就是这篇,尽管代码简单,但对于刚開始学习的人的我,看的还是有些吃力的,毕竟有些内容不是太理解,当时为了看代码费了非常大功夫,仅此记录一下,省的以后忘了
首先假设目的是做一个高亮效果,那么就要有阴影,在阴影的某个区域把颜色正常显示出来就是高亮了,所以先说下阴影的生成
原理上阴影的生成用的纹理 (结合混合)
就是CCRenderTexture::create(visibleSize.width, visibleSize.height, kCCTexture2DPixelFormat_RGBA8888);
后面那个參数是纹理样式的意思
这时候建设你的界面上已经有图片显示了,这时候你把这块纹理放到你屏幕中(注意zorder值要在背景之上),哈哈是出不来阴影效果的
还要加一句m_pTarget->clear(0,0,0,0.5f);
好吧这个函数我感觉非常奇异,有点像opengl中的glcolor4f的意思,感觉就是上色了。。。
另外最后那个0.5f就是opengl中的通道制,相当于与设置透明度了,假设是0 就是全透明,假设是1就是不透明
好的,把我们设定好的透明度为0.5纹理调整好位置大小(纹理也是ccnode的一种方法类似于精灵类)这样就能显示出一片阴影了
总结一下,实现阴影,就是先建立一块纹理,然后把它放到指定的位置上,把这块纹理的透明度设置小于1.0,这样就能在纹理区域生成阴影效果了。
然后就是高亮部分了
这里上一下上面引用博客MrBlue的代码
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
…………
…………
m_pTarget = CCRenderTexture::create(visibleSize.width, visibleSize.height, kCCTexture2DPixelFormat_RGBA8888);
m_pTarget->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));
addChild(m_pTarget, 10000);
return true;
}
void HelloWorld::setHighlightRect(const cocos2d::CCRect& rect)
{
CCSprite* pMask = CCSprite::create("btn-about-normal.png");
pMask->setPosition(ccp(rect.origin.x,rect.origin.y));
pMask->setAnchorPoint(ccp(0,0));
pMask->setScaleX(rect.size.width/pMask->getContentSize().width);
pMask->setScaleY(rect.size.height/pMask->getContentSize().height);
ccBlendFunc blend;
blend.src = GL_ZERO;
blend.dst = GL_ONE_MINUS_SRC_ALPHA;
pMask->setBlendFunc(blend);
m_pTarget->clear(0,0,0,0.8f);
m_pTarget->begin();
pMask->visit();
m_pTarget->end();
}
前面一个函数,就是生成阴影的部分,当然仅仅敲前面那几行是生成不了的,由于缺少了 m_pTarget->clear(0,0,0,0.8f);这一句,不知道为什么这位大神给放到了后面,放到前面的话,就能够直接生成阴影了哦。。
后面的那个函数就是令人激动人心得高亮部分了,嘿嘿
看看都干了些什么:
首先是设置了一个精灵,而且把精灵的大小位置都做了设定,这个没啥说的,继续
然后设置了一个混合对象,这里有个知识点,主要是说混合的一些原理和參数的,能够參考下这个博客,说的非常好
http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html
再看下代码
blend.src = GL_ZERO;
blend.dst = GL_ONE_MINUS_SRC_ALPHA;
好吧,我是这样理解的,原目标透明值清零(全透明),结果目标透明值等于1减去元目标的透明值,就是假设原目标的透明值是0.3,那么结果目标就是0.7,还是有些遮挡的吧,毕竟不是全透明,所以我做了一下改动blend.dst
= GL_ZERO;
嘿嘿,这下好了,原透明值为0,如今这个透明值也为零,世界清净了,都透明了,这下能够把后面“原“遮挡的东西本色展现出来了(为什么后面的图像不參与混合呢,后面会说),这样就形成了高亮
后面还有几行代码
m_pTarget->begin();
pMask->visit();
m_pTarget->end();
这个我纠结了非常久,毕竟还是菜鸟,上红孩儿的群里问了一下,他们说就是在纹理作用区域上绘制,恩,答得非常精辟啊
我是这样理解的
a->begin();
b->visit();
b->end();
a是个纹理,b在a上进行绘制,不会影响到其它(这应该就是后面的透明值没有受到影响的原因),这样这个二次混合就仅仅针对产生了阴影的纹理作用了,进而产生了高亮的效果
还有那个visit,好吧,之前还真不知道,刚開始学习的人,羞愧啊,就是遍历全部子节点绘制的意思吧,意思不知道到不到位,还须要多实践啊。。。
欢迎批评指正,我就脸皮厚,不怕歧视,嘿嘿
九月份要找工作了,加油
Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会的更多相关文章
- cocos2d-x学习记录第一篇-环境变量配置
最近准备学习cocos2d-x,之前一直是做iOS开发的,算是零基础开始学习吧. (此条后来修改,不用配置下面这些东西,下载一个cocosstudio就可以了,直接在里边就创建工程了) 本人用Mac电 ...
- cocos2d-x 学习记录
不积跬步,无以至千里.不积小流,无以成江海. 開始学习cocos2d-x ,路漫漫其修远兮.加油!
- cocos2d-x学习记录6——自定义Button
cocos2d-x中封装CCMenuItem等相关按钮,但是有些时候需要自己封装按钮,这样能够更加灵活的实现对应功能. 自定义Button,需要重写OnEnter()和onExit()函数,并在对应函 ...
- cocos2d-x学习记录5——CCTransition场景过渡
利用CCTransition能够创建出一系列的场景过渡动画,能够使场景切换时更加绚丽丰富. CCTransition派生出很多过渡动画,传入的参数一般包括过渡时间和创建的场景. MyScene.h内容 ...
- cocos2d-x学习记录3——CCTouch触摸响应
游戏不同于影音,强交互性是其一大特色,在游戏中主要体现为接受用户的输入并响应.智能手机触摸是其重要的输入方式. 在cocos2d-x中,触摸分为单点触摸和多点触摸. 单点触摸:主要继承CCTarget ...
- cocos2d-x学习记录1——图片显示
这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...
- cocos2d-x学习记录4——图形绘制
重写CCNode的draw函数能够绘制出各种基本图形,如点.直线.多边形.园.贝塞尔曲线等,同时还可以设置绘制的颜色和宽度. MyScene的draw函数 void MyScene::draw() { ...
- cocos2d-x学习记录2——CCAction动作
CCAction能够使CCNode运动起来,能够呈现出多种多样的动作.这些动作能够改变其运动方向.形状.大小.旋转等. 同时,还可利用CCCallFunc.CCCallFuncN.CCCallFunc ...
- ElasticSearch 学习记录之ES高亮搜索
高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...
随机推荐
- 解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题
1.开始 -- 运行,输入”Regedit“,打开 注册表 . 2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ‘计算机\HKEY_CURRENT_USER\Software\E ...
- 图片碎片化mask动画
图片碎片化mask动画 效果 源码 https://github.com/YouXianMing/Animations // // TransformFadeViewController.m // A ...
- Objective-C:NSArray的常见操作
NSArray不可变字符串的主要操作有:创建.枚举.排序.与NSString之间的相互转换 注意: NSArray可以存对象,不可以存基本数据类型.结构体.数组.指针.nil.NULL NSArray ...
- 理解 CSS 的 z-index 属性
通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素. 所有的盒模型元素都处于三维坐标系中. 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, ...
- JavaScript之深浅拷贝
数组的浅拷贝 如果是数组,我们可以利用数组的一些方法比如:slice.concat 返回一个新数组的特性来实现拷贝.比如: , true, null, undefined]; var new_arr ...
- 理解闭包的微观世界和JS垃圾回收机制
function a() { ; function b() { alert(++i); } return b; } var c = a(); c(); 一.闭包的微观世界 如果要更加深入的了解闭包以及 ...
- Linux下删除相互依赖的包
今天遇到一个问题,使用RPM 卸载包的时候两个包相互依赖 包A 和包B 卸载A的时候提示需要先卸载B ,反之亦然 经过一番百度 可以在命令后面加参数--nodeps 例如 rpm -e php-jso ...
- cocos2d-x -3.81+win7+vs2013开发环境创建新的项目
cocos2d-x -3.81+win7+vs2013开发环境创建新的项目 1.准备阶段 (1) vs2013下载及安装 (2)cocos2d-x 3.8.1下载及解压 (3)python下载及安装( ...
- matlab:eval用法
1.自动生成变量 % auto general variabalsb=rand(3,3)for i=1:8 eval(['a_',num2str(i),'=','b(',num2str(i),' ...
- Java从零开始学十五(继承)
一.继承作用 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法 ...