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;
}
CCSpriteFrameCache精灵帧缓存分析(3):CCSpriteFrame分析
最新推荐文章于 2016-12-13 09:44:50 发布