cocos2dx-深度解析plist文件(二)(CCSpriteFrameCache怎么从解析出的数据创建精灵帧的)
精灵帧的创建
CCSpriteFrameCache::addSpriteFramesWithDictionary(CCDictionary* dictionary, CCTexture2D *pobTexture)里面的CCDICT_FOREACH(framesDict, pElement)完成了对key为frame的字典的遍历,代码如下
CCDictionary* frameDict = (CCDictionary*)pElement->getObject();
std::string spriteFrameName = pElement->getStrKey();
CCSpriteFrame* spriteFrame = (CCSpriteFrame*)m_pSpriteFrames->objectForKey(spriteFrameName);
上面代码先从pElement中获得一个字典frameDict,然后获得它的key,其key是精灵帧的名字。一个精灵帧的XML形式如下如下
<key>1.png</key>
<dict>
<key>frame</key>
<string>{
{2,868},{110,102}}</string>
<key>offset</key>
<string>{1,-15}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{
{24,39},{110,102}}</string>
<key>sourceSize</key>
<string>{156,150}</string>
</dict>
上面1.png是字典的key,dict是字典对象的value.如果if (spriteFrame)那么就continue。如果找不到就会执行下面代码
// create frame
spriteFrame = new CCSpriteFrame();
spriteFrame->initWithTexture(pobTexture,
frame,
rotated,
offset,
sourceSize
);
上面代码根据解析出的数据创建一个精灵帧。下面研究下精灵帧如何通过这些数据被创建的。
spriteFrame->initWithTexture代码如下
bool CCSpriteFrame::initWithTexture(CCTexture2D* pobTexture, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
m_pobTexture = pobTexture;
if (pobTexture)
{
pobTexture->retain();
}
m_obRectInPixels = rect;
m_obRect = CC_RECT_PIXELS_TO_POINTS(rect);
m_obOffsetInPixels = offset;
m_obOffset = CC_POINT_PIXELS_TO_POINTS( m_obOffsetInPixels );
m_obOriginalSizeInPixels = originalSize;
m_obOriginalSize = CC_SIZE_PIXELS_TO_POINTS( m_obOriginalSizeInPixels );
m_bRotated = rotated;
return true;
}
上面创建了m_obRect等变量后面都有用处。上一篇分析中提到pobTexture是由解析plist后创建的,pobTexture已经加入了纹理缓存,并且计数为1。这个时候该纹理是未使用纹理,可以调用纹理缓存的removeUnusedTextures直接删除掉的。上面的initWithTexture里面被没有做什么,如果纹理存在,就把纹理的计数加一,这样表示有一个对象引用该纹理了,如果纹理不存在,就不做什么,后面就简单的记录下一些信息,这些信息用于创建精灵的。通过精灵帧创建精灵的代码如下
CCSprite* CCSprite::createWithSpriteFrame(CCSpriteFrame *pSpriteFrame)
{
CCSprite *pobSprite = new CCSprite();
if (pSpriteFrame && pobSprite && pobSprite