探cocos2dx特效实现(effects),源码版本(2.2.3)

来源:互联网 发布:mac电脑忘记管理员密码 编辑:程序博客网 时间:2024/06/05 20:54

cocos2dx实现的特效非常多,粗略算了下差不多有22种,如果需要查看具体表现效果的话可以运行TestCpp的effects test。

cocos2dx特效渲染使用opengl的fbo技术。fbo全称frame buffer object,如vbo一样,是opengl的一种优化渲染技术,用于提高渲染性能,不同于vbo用于顶点属性,当启用fbo之后的渲染命令会作用于纹理、RBO中,只有撤销fbo之后才会渲染到帧缓存内,也就是说fbo相当于一个调整渲染目标的技术。当fbo渲染到纹理、RBO之后,可以直接使用那些对象(作用于纹理时可以直接使用渲染到的纹理,RBO对象可以通过glReadBuffer、glBlitFramebuffer进行拷贝)。当然这需要连接到可渲染的对象上才行,单独的fbo无法
产生作用。其应用场景大多是需要获得已经渲染了的内容,比如说显示镜子上影像。以前的做法是先渲染到缓存,然后读到内存中,形成一个纹理。这样镜子里的影像就可以当成一个纹理贴到镜子上。现在使用fbo之后省掉了这一系列麻烦的操作,直接渲染到纹理,再然后贴到镜子上。

cocos2dx里边实现特效的方式也使用了类似于实现镜子影像的原理,可以看到在ccnode的visit()渲染函数里边会优先判断是否启用了特效格子,如果启用了特效格子那么挂接到fbo(beforeDraw()),然后才开始渲染ccnode以及它的子节点,最后在afterDraw()才会绘制到帧缓存中。

模块相关类:
CCGrabber:
封装fbo使用的细节。
CCGridBase:
封装设置特效格子一系列基础参数的方法,包含有beforeDraw,afterDraw。
CCGrid3D:
封装实际渲染方法,跟随时间变动调整格子坐标的方法。
CCTiledGrid3d:
类似于CCGrid3D。
uml图:



使用方式:
CCNode *tempNode = CCNode::Create();
CCWave3D *tempAction = CCWave3D::Create(2.5f,CCSize(15,12),rand()%10,rand()%60);
tempNode->runAction(tempAction);
tempNode->addChild(CCSprite::Create("randomPirture.png"))
addChild(tempNode);

扩展:
模块相关类已经说明了具体类封装的功能,针对这些功能使用继承的方式添加修改就可以了。
0 0
原创粉丝点击