CCTexture2D* cache = CCTextureCache::sharedTextureCache()->addImage("hero.png");(2) CCSprite
//CCTexture2D表示精灵包含的图片,范围是整张图片 static CCSprite* spriteWithTexture(CCTexture2D *pTexture); //CCRect表示图片的指定范围,即从图片的指定矩形区域裁剪 static CCSprite* spriteWithTexture(CCTexture2D *pTexture, const CCRect& rect); //CCSpriteFrame表示精灵的某一帧,大多数情况下精灵本身的图片有多帧。它内部封装了CCTexture2D和CCRect,可以从一个大图片取出一部分作为一帧。 static CCSprite* spriteWithSpriteFrame(CCSpriteFrame *pSpriteFrame); //pszSpriteFrameName表示帧的名字,根据帧名从内存中取出CCSpriteFrame static CCSprite* spriteWithSpriteFrameName(const char *pszSpriteFrameName); //pszFileName表示本地图片文件名 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);(3) CCTextureCache
CCTexture2D * CCTextureCache::addImage(const char * path) { CCTexture2D * texture = NULL; std::string pathKey = path; CCFileUtils::ccRemoveHDSuffixFromFile(pathKey); pathKey = CCFileUtils::fullPathFromRelativePath(pathKey.c_str()); texture = m_pTextures->objectForKey(pathKey); std::string fullpath = pathKey; // (CCFileUtils::fullPathFromRelativePath(path)); if( ! texture ) { /** .... */ } return texture; }
如果需要一次加载多张图片的时候,可以先把图片加载到CCTextureCache中,这样使用图片的时候速度就会很快了。
(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(同一张图片),类似下面这样的图片,4个贝壳都在同一纹理上:
在addChild的时候会检查子节点纹理的名称跟CCSpriteBatchNode的是不是一样,如果不一样就会出错,源码:
void CCSpriteBatchNode::addChild(CCNode *child, int zOrder, int tag) { /** ... */ // check CCSprite is using the same texture id CCAssert(pSprite->getTexture()->getName() == m_pobTextureAtlas->getTexture()->getName(), ""); /** ... */ }下面是使用CCSpriteBatchNode的使用代码示例:
CCSpriteBatchNode* BatchNode1 = CCSpriteBatchNode::batchNodeWithFile("Images/grossini_dance_atlas.png", 50); addChild(BatchNode1, 0, kTagSpriteBatchNode); CCSpriteBatchNode* BatchNode = (CCSpriteBatchNode*) getChildByTag( kTagSpriteBatchNode ); int idx = CCRANDOM_0_1() * 1400 / 100; int x = (idx%5) * 85; int y = (idx/5) * 121; CCSprite* sprite = CCSprite::spriteWithTexture(BatchNode->getTexture(), CCRectMake(x,y,85,121)); BatchNode->addChild(sprite); sprite->setPosition( ccp( p.x, p.y) );(5) CCSpriteFrameCache
下面是使用CCSpriteFrameCache的使用代码示例:
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("animations/grossini.plist", "animations/grossini.png"); m_pSprite1 = CCSprite::spriteWithSpriteFrameName("grossini_dance_01.png"); m_pSprite1->setPosition( ccp( s.width/2-80, s.height/2) );
只要plist文件跟对应的png图片在同一目录下,且名字相同,则addSpriteFramesWithFile(“animations/grossini.plist”, “animations/grossini.png”)可以改成addSpriteFramesWithFile(“animations/grossini.plist”);
2. CCSpriteBatchNode和CCSpriteFrameCache结合使用
必须保证CCSpriteFrameCache和CCSpriteBatchNode加载的是同一纹理贴图。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animations/ghosts.plist", "animations/ghosts.png"); CCSpriteBatchNode *aParent = CCSpriteBatchNode::batchNodeWithFile("animations/ghosts.png"); addChild(aParent, 0, kTagSprite1); CCSprite *pFather = CCSprite::spriteWithSpriteFrameName("father.gif"); pFather->setPosition(ccp( s.width/2, s.height/2)); aParent->addChild(pFather, 0, kTagSprite2);