转自:
http://blog.sina.com.cn/s/blog_bcbac6b90101fs92.html
CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png");
(4) 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的是不是一样,如果不一样就会出错,
5) CCSpriteFrameCache
它是管理CCSpriteFrame的内存池,跟CCTextureCache功能一样,不过跟CCTextureCache不同的是,如果内存池中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。它的内部封装了一个字典:CCDictionary *m_pSpriteFrames,key为帧的名称。CCSpriteFrameCache一般用来处理plist文件(这个文件指定了每个独立的精灵在这张“大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。
下面是使用CCSpriteFrameCache的使用代码示例:
[cpp]
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("animations/grossini.plist", "animations/grossini.png");
m_pSprite1 = CCSprite::spriteWithSpriteFrameName("grossini_dance_01.png");
CCSpriteFrameCache * cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("game-art.plist");
CCSpriteFrame * frame = cache->spriteFrameByName("ship-anim0.png");
CCSpriteBatchNode * node = CCSpriteBatchNode::createWithTexture(frame->getTexture());
this->addChild(node,2);
for(int i=0;i<<span style="color: #0433ff">5;i++)
{
CCSprite * sprite = CCSprite::createWithSpriteFrame(frame);
sprite->setPosition(ccp(CCRANDOM_0_1()*480,CCRANDOM_0_1()*320));
node->addChild(sprite);
}
在这里要注意的就是 两种获得图片纹理的不同方式,一种就是通过
CCSpriteFrameCache先获取plist文件,该文件是个字典,里面的元素可以通过键值取到,然后在加入到 CCSpriteBatchNode中进行渲染,第二种方法就是用 CCTexture2D首先通过 CCTexture2D * text2d = CCTextureCache :: sharedTextureCache ()-> addImage ( "enemy_duck.png" );获得一张贴图,然后在将这些图分别画出来,代码如下CCTexture2D * text2d = CCTextureCache::sharedTextureCache()->addImage("enemy_duck.png");
if (!CCSprite::initWithTexture(text2d))
{
return false;
}
CCArray * frames = CCArray::create();
float spritewith= text2d->getContentSize().width/10;
float hight = text2d->getContentSize().height;
for(int i=0;i<<span style="color: #0433ff">10;i++)
{
CCRect rect = CCRectMake(spritewith*i, 0, spritewith, hight);
CCSpriteFrame * sprite =CCSpriteFrame::createWithTexture(text2d, rect);
frames->addObject(sprite);
}
CCAnimation * anim =CCAnimation::createWithSpriteFrames(frames,0.08f);
CCAnimate * animate = CCAnimate::create(anim);
CCRepeatForever *repeate =CCRepeatForever::create(animate);
this->runAction(repeate);