• 欢迎来到GeekFaner

    每周更新一篇教程,轻松学习cocos2d-x

    联系我们
  • 又是一个美好的一天

    每天的太阳都是新的,今天要比昨天好

    联系我们
  • 出发!

    开始今天的课程学习,让我们的明天更美好

    联系我们

课程概述

“Cocos2d-X的精灵”课程概述

游戏中存在着大量的精灵元素,本节课讲从游戏引擎源码的角度详解精灵。

教学视频

课程笔记

精灵的创建

精灵通常是通过texture创建,将texture的全部或者一部分与sprite进行关联。创建方法除了createWithTexture,其他方法都会将对应的texture存入textureCache中。针对手动创建的texture2D,需要小心管理其内存。可以通过setTexture动态设置Sprite的Texture。

Sprite包含类型为V3F_C4B_T2F_Quad的成员变量,该变量包含了Sprite四个顶点的顶点坐标、颜色、纹理坐标(由于OpenGL ES不支持矩阵绘制,所以绘制的时候会拆分成2个三角形进行绘制),当进行移动、缩放、旋转、扭曲、颜色叠加等操作的时候,只需要修改该成员变量即可。Sprite通过QuadCommand命令进行绘制。

颜色混合:Blend是将绘制得到的颜色与framebuffer上的颜色进行混合计算,计算方式和混合因子是通过glBlendEquation和glBlendFunc进行设置,默认的glBlendEquation为GL_FUNC_ADD,glBlendEquation为GL_SRC_ALPHA(source),GL_ONE_MINUS_SRC_ALPHA(desc)

颜色叠加:在(Cocos2d-X的UI树(2))一节中,我们学到了Node的addchild方法,在Node的addchild方法中我们用到了颜色叠加函数updateCascadeColor、updateCascadeOpacity。当Node的成员变量_cascadeColorEnabled处于开启状态(通过setCascadeColorEnabled设置,通过isCascadeColorEnabled函数读取),如果parent的_cascadeColorEnabled已经开启,将parent的_displayedColor/255*_realColor(通过Node的setColor函数设置,默认为1)传入fragment shader,通过ccshader_positiontexturecolor_nomvp中的v_fragmentColor对绘制到framebuffer的颜色产生影响。同理还有alpha叠加函数updateCascadeOpacity。在Cocos2d-X中使用TintTo、TintBy实现颜色叠加效果

精灵的优化

alpha预乘:按照默认的颜色混合,blend的时候需要将src*alpha+desc*(1-alpha),可以将src*alpha放在线下完成。然后通过:1、修改blend参数;2、在创建Image的时候设置_hasPremultipliedAlpha;3、在创建Texture2D的时候,当格式为PVR,设置_hasPremultipliedAlpha。

精灵表:精灵表将多个精灵合并在一起,通过一个配置文件(比如plist文件)来管理。通过spriteframecache来读取精灵表,然后通过配置文件将精灵表中的精灵存储为一个spriteframe对象,通过spriteframe创建精灵。一个精灵表对应一张texture,然后在绘制的时候借用Cocos2d-X的自动批处理机制即可实现减少绘制次数的目的。

精灵动画:关键帧动画和骨骼动画所取用的精灵均来自spriteframe,设计师设计好配置文件,然后开发者只需要通过AnimationCache获取即可。

spritebatchnode和自动批处理。spritebatchnode的缺点:只执行一次绘制,sprite的层级是相邻的。

部分拉缩,九宫格:Scale9Sprite,将一个sprite分成9分,对中间那一份进行处理。借用了spritebatchnode的处理。

联系我们

笔者制作网站的目的,主要是借用自己之前的知识背景(Android App开发和图形学知识),将自己学习笔记拿出来,和大家一起进行交流,毕竟每个人的知识体系不同,有交流才会有提高,所以欢迎大家通过各种方式和我联系。
网址:www.geekfaner.com
youku教学视频:http://i.youku.com/geekfaner
“百度传课”教学视频(高清版_推荐):http://www.chuanke.com/s2588605.html

wangshuo@geekfaner.com