本文共 4092 字,大约阅读时间需要 13 分钟。
CCSpriteFrameCache精灵帧缓存分析(3):上面两篇中已经对CCSpriteFrameCache进行了分析,CCSpriteFrameCache就是对精灵帧进行缓存,那么精灵帧是什么呢?我们这一篇来分析一下:1、 /** @brief A CCSpriteFrame has: //这里说明精灵帧拥有两个东西:(1)纹理,(2)在纹理坐标和大小 - texture: A CCTexture2D that will be used by the CCSprite - rectangle: A rectangle of the texture 继承自class CC_DLL CCSpriteFrame : public CCObject 2、在CCSpriteFrameCache中都是通过下面这个方法初始化精灵帧的: /* // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, frame, rotated, offset, sourceSize ); */bool CCSpriteFrame::initWithTexture(CCTexture2D* pobTexture, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize){ m_pobTexture = pobTexture; if (pobTexture) { //对纹理的引用计数加1 pobTexture->retain(); } //从这里可以看到,其实CCSpriteFrame精灵帧就是包含了纹理,纹理坐标和大小,旋转等 //信息的一个类,拥有这些信息,我们就可以使用精灵帧来创建精灵了。 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;}3、使用精灵帧创建精灵: /** * Creates a sprite with an sprite frame. * * @param pSpriteFrame A sprite frame which involves a texture and a rect * @return A valid sprite object that is marked as autoreleased. */ static CCSprite* createWithSpriteFrame(CCSpriteFrame *pSpriteFrame); ----->>> CCSprite* CCSprite::createWithSpriteFrame(CCSpriteFrame *pSpriteFrame){ CCSprite *pobSprite = new CCSprite(); if (pSpriteFrame && pobSprite && pobSprite->initWithSpriteFrame(pSpriteFrame)) { pobSprite->autorelease(); return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL;}---->>>bool CCSprite::initWithSpriteFrame(CCSpriteFrame *pSpriteFrame){ CCAssert(pSpriteFrame != NULL, ""); //使用精灵帧中的纹理创建精灵 bool bRet = initWithTexture(pSpriteFrame->getTexture(), pSpriteFrame->getRect()); setDisplayFrame(pSpriteFrame); return bRet;}4、使用缓存过的精灵帧创建精灵: /** * Initializes a sprite with an sprite frame name. * * A CCSpriteFrame will be fetched from the CCSpriteFrameCache by name. * If the CCSpriteFrame doesn't exist it will raise an exception. * * @param pszSpriteFrameName A key string that can fected a volid CCSpriteFrame from CCSpriteFrameCache * @return true if the sprite is initialized properly, false otherwise. */ virtual bool initWithSpriteFrameName(const char *pszSpriteFrameName);5、通过图片文件名创建精灵帧,但是必须传入一个纹理坐标和大小 /** Create a CCSpriteFrame with a texture filename, rect in points. It is assumed that the frame was not trimmed. */ static CCSpriteFrame* create(const char* filename, const CCRect& rect);---->>>>> CCSpriteFrame* CCSpriteFrame::create(const char* filename, const CCRect& rect){ CCSpriteFrame *pSpriteFrame = new CCSpriteFrame();; pSpriteFrame->initWithTextureFilename(filename, rect); pSpriteFrame->autorelease(); return pSpriteFrame;}---->>>这里可以看到并没有加载纹理,那么在什么时候加载纹理呢?bool CCSpriteFrame::initWithTextureFilename(const char* filename, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize){ m_pobTexture = NULL; m_strTextureFilename = filename; 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;}---->>>在获取纹理的时候加载纹理:CCTexture2D* CCSpriteFrame::getTexture(void){ if( m_pobTexture ) { return m_pobTexture; } //加载纹理 if( m_strTextureFilename.length() > 0 ) { return CCTextureCache::sharedTextureCache()->addImage(m_strTextureFilename.c_str()); } // no texture or texture filename return NULL;}
转载地址:http://nmsmi.baihongyu.com/