探cocos2dx对游戏精灵(sprite_nodes)的实现。(源码版本2.2.3)

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就可以了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值