cocos2dx-深度解析plist文件(二)(CCSpriteFrameCache怎么从解析出的数据创建精灵帧的)

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值