static CCSprite* CCSprite::create(const char *pszFileName)的简单分析
CCSpriteBatchNoded,CCSpriteFrameCache的简单分析
我的版本:cocos2d-2.0-rc2-x-2.0.1
本人理解有误之处,希望看官不吝指出。
1 static CCSprite* CCSprite::create(const char *pszFileName)的简单分析
一个CCSprite对象的主要成员是CCTexture2D对象。
create方法产生CCSprite对象的步骤为:先new一个CCSprite对象,然后调用CCSprite的初始化方法:initWithFile(pszFileName)。下面是create方法。
CCSprite* CCSprite::create(const char *pszFileName) { CCSprite *pobSprite = new CCSprite(); if (pobSprite && pobSprite->initWithFile(pszFileName)) { pobSprite->autorelease(); return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL; }
而初始化方法的目的主要是填充新产生的CCSprite对象的CCTextture2D成员。这个成员实际上是通过CCTextureCache来获得。下面是初始化方法。
bool CCSprite::initWithFile(const char *pszFilename) { CCAssert(pszFilename != NULL, "Invalid filename for sprite"); CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename); if (pTexture) { CCRect rect = CCRectZero; rect.size = pTexture->getContentSize(); return initWithTexture(pTexture, rect); } // don't release here. // when load texture failed, it's better to get a "transparent" sprite then a crashed program // this->release(); return false; }
CCTextureCache::sharedTextureCache()->addImage(pszFilename)获得CCTexture2D对象的过程:通过pszFilename查询CCTextureCache内部保存的所有CCTexture2D对象,如果有,则直接返回,没有,则生成一个。如果是新生成一个CCTexture2D对象,那么就会涉及到读文件操作。
2 CCSpriteBatchNoded,CCSpriteFrameCache的简单分析
CCSpriteBatchNoded的一般使用方法是:利用CCSpriteFrameCache添加plist文件,然后通过CCSpriteFrameByName引用。下面是添加方法。
void CCSpriteFrameCache::addSpriteFramesWithFile(const char* plist, const char* textureFileName) { CCAssert(textureFileName, "texture name should not be null"); CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(textureFileName); if (texture) { addSpriteFramesWithFile(plist, texture); } else { CCLOG("cocos2d: CCSpriteFrameCache: couldn't load texture file. File not found %s", textureFileName); } }
添加的方法是:通过CCtextreCache获得plist文件对应的大图的CCTextrue2D。之后通过plist文件所记录的信息,把大图逻辑上拆分成多个共享CCTextrue2D的CCSpriteFrame,并以键值对的形式保存在CCSpriteFrameCache里面。
获得CCSpriteFrame的方法是:通过CCSpriteFrameCahce的CCSpriteFrameByName方法,来找到对应的CCSprieteFrame。这个时候,每次产生的CCSpriteFrame都是之前那张大图,只是逻辑上是获得该大图的不同区域而已。
使用CCSpriteBatchNoded的主要目的是优化性能。
主要注意点:
1 添加到ccspriteBatchNode里面的精灵的纹理必须与产生CCSpriteBatchNode对象的纹理是同样的。
2 添加到ccspriteBatchNode里面的精灵的深度相对于外部都是一样的,如果要有不同深度的效果,那么可能要放置在不同的ccspriteBatchNode里面来实现。