cocos2dx负责精灵功能相关代码在sprite_node,在这个文件夹里有几个文件,主要涉及有几个类(
所有名字以node结尾的文件模块均为场景渲染点
)
说起精灵,就不得不谈纹理渲染,在cocos2dx里边纹理的渲染是使用shader来完成的。大家可以看一下ccnode的渲染代码,在每次draw的时候都会绑定shader,如果有纹理的话会调用ccGLBindTexture2D(m_pTexture->getName());在每一次渲染的时候都会调用glDrawArray或者是glDrawElements。
看一下那个索引为kCCShader_PositionTexture_uColor,shader的代码,可以知道,每一个片段的颜色都会从纹理中拿到。
gl_FragColor = texture2D(CC_Texture0, v_texCoord) * u_color; 代码中的CCTexture0就是ccGLBindTexture2D(m_pTexture->getName());绑定的纹理。
相关类:
CCAnimation:
这是一个容器类,保存CCAnimationFrame类对象(也即动画帧),在使用action播放动画的时候需要用到这个对象。
CCAnimationCache:
动画类的cache,相当于一个容器,单例类,保存CCAnimation类对象,提供多种方式创建CCAnimation。
CCSprite:
精灵类,
场景渲染结点。可以被用作一个渲染精灵单位,可以直接单独渲染一个ccspriteframe对象,也可以用作ccspritebatchnode批次渲染的quad。
CCSpriteBatchNode:
提高渲染性能的批次渲染类,
在使用批次渲染时由CCSprite负责提供quad,渲染由batchnode来渲染。
CCSpriteFrame
精灵帧,
这个类提供了创建精灵帧时候一些参数的设置,比如说是否旋转,rect大小,这个rect对应实际映射到屏幕上贴图的具体大小。
CCSpriteFrameCache:
精灵帧cache,相当于一个容器,单例类,
这个类提供了一系列创建精灵帧的方法。
经过一段时间的阅读,总结了相关类之间的关系,如图下图(uml):
在使用CCAnimation的时候可以从plist直接加载动画如下代码:
char plist[64] = {0};
CCAnimationCache->sharedAnimationCache()->addAnimationsWithFile(
plist
)
;//在这里边用到了CCSpriteFrameCache,在生成CCSpriteFrame之后再转CCAnimationFrame最后生成CCAnimation。
其他使用方法略。
使用批次渲染结点:
char textureName[64] = {0};
unsigned int capacity = 1;//渲染quad的数量。
CCSpriteBatchNode *tempNode =
CCSpriteBatchNode::Create(textureName, capacity
);//这里生成了一个CCTextureAtlas对象,渲染是由
CCTextureAtlas来执行的。
CCSprite *tempSprite = new CCSprite();
tempSprite->initWithTexture(tempNode->getTexture(),CCRectMake(0,0,rand()%100,
rand()%100
));//这里为了方便,设置随机大小了。
tempNode->appendChild(tempSprite);
//or
//unsigned int quadIndex = 0;
//tempNode->insertChild(tempSprite,
quadIndex
);
//这里做的就是更新CCTextureAtlas的quad。
扩展:
感觉cocos2dx对精灵支持的功能已经足够了,要扩展的话也只有扩展texture模块来支持不同贴图格式,在转成CCTexuture2D就可以了。