1. static CCSprite* CCSprite::create(const char *pszFileName)的简单分析

  2. 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里面来实现。