cocos2d 精灵sprite类型的粗略说明

1> CCImage

绘制是通过CCTexture2D来实现的(OPENGL es)通过纹理绘制到某个面。

2> CCTexture2D
可以把它看成一个纹理,它是cocos2d-x渲染图形的重要参数,用来贴图,因为cocos2d-x使用opengl es绘制2d图形的,它的尺寸是2的n次方。一般通过以下方式获得:
CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png");

3> CCSprite
这个就是精灵类,是CCNode的子类,可以直接添加到CCLayer或CCScene,它的内部封装了CCTexture2D(纹理),可以通过下面几种方式初始化精灵对象。
static CCSprite* spriteWithTexture(CCTexture2D pTexture); //CCTexture2D表示精灵包含的图片,范围是整张图片
static CCSprite
 spriteWithTexture(CCTexture2D pTexture, const CCRect& rect); //CCRect表示图片的指定范围,即从图片的指定矩形区域
static CCSprite
 spriteWithSpriteFrame(CCSpriteFrame pSpriteFrame); CCSpriteFrame表示精灵的某一帧,内部封装了CCTexture2D和CCRect,CCRect表示图片的指定范围,即从图片的指定矩形区域裁剪
static CCSprite
 spriteWithSpriteFrameName(const char pszSpriteFrameName);

static CCSprite
 spriteWithFile(const char pszFileName);
static CCSprite
 spriteWithFile(const char pszFileName, const CCRect& rect);
static CCSprite
 spriteWithBatchNode(CCSpriteBatchNode batchNode, const CCRect& rect);

下面是两种比较常用的初始化精灵的方式:
CCSprite
 sprite = CCSprite::spriteWithFile("hero.png");
/** 或者 **/
CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png");
CCSprite* sprite = CCSprite::spriteWithTexture(cache);

4> CCTextureCache (singleton)

它相当于CCTexture2D的容器,是内存池,用来缓存CCTexture2D对象的,它内部有一个字典CCMutableDictionary m_pTextures,key为图片的名称,值是CCTexture2D。当调用它的addImage函数添加图片时,会先根据图片名称去内存中查找是否已存在,是则直接取出返回。如果需要一次加载多张图片的时候,可以先把图片加载到CCTextureCache中,这样使用图片的时候速度就会很快了。

5> CCSpriteBatchNode

它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显。因为cocos2d-x采用opengl es绘制图片的,opengl es绘制每个精灵都会执行:open-draw-close流程。而CCSpriteBatchNode是把多个精灵放到一个纹理上,绘制的时候直接统一绘制该texture,不需要单独绘制子节点,这样opengl es绘制的时候变成了:open-draw()-draw()…-draw()-close(),节省了多次open-close的时间。CCSpriteBatchNode内部封装了一个CCTextureAtlas(纹理图集,它内部封装了一个CCTexture2D)和一个CCArray(用来存储CCSpriteBatchNode的子节点:单个精灵)。注意:因为绘制的时候只open-close一次,所以CCSpriteBatchNode对象的所有子节点都必须和它是用同一个texture(同一张图片,否则就会在addChild()时出错.

CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create( "Icon.png" , 1000);
batchNode->setPosition(CCPointZero);
this ->addChild(batchNode);
 
for ( int i = 0;i < 1000;++i){
  int x = arc4random()%960;
  int y = arc4random()%640;
  CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
  testIcon->setPosition( ccp(x, y) );
  batchNode->addChild(testIcon);
}

6> CCSpriteFrameCache (singleton)

它是管理CCSpriteFrame的内存池,跟CCTextureCache功能一样,不过跟CCTextureCache不同的是,如果内存池中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。它的内部封装了一个字典:CCDictionary *m_pSpriteFrames,key为帧的名称。CCSpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("animations/grossini.plist", "animations/grossini.png");
m_pSprite1 = CCSprite::spriteWithSpriteFrameName("grossini_dance_01.png");

只要plist文件跟对应的png图片在同一目录下,且名字相同,则addSpriteFramesWithFile(“animations/grossini.plist”, “animations/grossini.png”)可以改成addSpriteFramesWithFile(“animations/grossini.plist”);


Refer to: http://my.eoe.cn/sdhjob/archive/217.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值