#include "textures/CCTextureCache.h"
#include "CCSpriteFrame.h"
#include "CCDirector.h"
//使用Cocos2d命名空间
NS_CC_BEGIN
//从一个图集纹理中创建出一帧,内部调用后面的createWithTexture函数实现,参一为图集纹理,参二为纹理块矩形。
CCSpriteFrame* CCSpriteFrame::frameWithTexture(CCTexture2D *pobTexture, const CCRect& rect)
{
return CCSpriteFrame::createWithTexture(pobTexture, rect);
}
//从一个图集纹理中创建出一帧,参一为图集纹理,参二为纹理块矩形。
CCSpriteFrame* CCSpriteFrame::createWithTexture(CCTexture2D *pobTexture, const CCRect& rect)
{
//新帧一个精灵帧,初始化完毕后交由内存管理器进行释放管理。
CCSpriteFrame *pSpriteFrame = new CCSpriteFrame();;
pSpriteFrame->initWithTexture(pobTexture, rect);
pSpriteFrame->autorelease();
//返回新创建的精灵帧。
return pSpriteFrame;
}
//从一张图集图片中创建出一帧,内部调用后面的create函数实现,参一为图集图片名称,参二为纹理块矩形。
CCSpriteFrame* CCSpriteFrame::frameWithTextureFilename(const char* filename, const CCRect& rect)
{
return CCSpriteFrame::create(filename, rect);
}
//从一张图集图片中创建出一帧,参一为图集图片名称,参二为纹理块矩形。
CCSpriteFrame* CCSpriteFrame::create(const char* filename, const CCRect& rect)
{
//新帧一个精灵帧,初始化完毕后交由内存管理器进行释放管理。
CCSpriteFrame *pSpriteFrame = new CCSpriteFrame();;
pSpriteFrame->initWithTextureFilename(filename, rect);
pSpriteFrame->autorelease();
//返回新创建的精灵帧。
return pSpriteFrame;
}
//从一个图集纹理中创建出一帧,内部调用后面的createWithTexture函数实现,参一为图集纹理,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉纹理块空白后所导致的锚点偏移,参五为纹理块的原始大小。
CCSpriteFrame* CCSpriteFrame::frameWithTexture(CCTexture2D* pobTexture, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
return CCSpriteFrame::createWithTexture(pobTexture, rect, rotated, offset, originalSize);
}
//从一个图集纹理中创建出一帧,参一为图集纹理,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉纹理块空白后所导致的锚点偏移,参五为纹理块的原始大小。
CCSpriteFrame* CCSpriteFrame::createWithTexture(CCTexture2D* pobTexture, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
//新帧一个精灵帧,初始化完毕后交由内存管理器进行释放管理。
CCSpriteFrame *pSpriteFrame = new CCSpriteFrame();;
pSpriteFrame->initWithTexture(pobTexture, rect, rotated, offset, originalSize);
pSpriteFrame->autorelease();
//返回新创建的精灵帧。
return pSpriteFrame;
}
//从一个张图集图片中创建出一帧,内部调用后面的create函数实现,参一为图集图片名称,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉纹理块空白后所导致的锚点偏移,参五为纹理块的原始大小。
CCSpriteFrame* CCSpriteFrame::frameWithTextureFilename(const char* filename, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
return CCSpriteFrame::create(filename, rect, rotated, offset, originalSize);
}
//从一个张图集图片中创建出一帧,参一为图集图片名称,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉纹理块空白后所导致的锚点偏移,参五为纹理块的原始大小。
CCSpriteFrame* CCSpriteFrame::create(const char* filename, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
//新帧一个精灵帧,初始化完毕后交由内存管理器进行释放管理。
CCSpriteFrame *pSpriteFrame = new CCSpriteFrame();;
pSpriteFrame->initWithTextureFilename(filename, rect, rotated, offset, originalSize);
pSpriteFrame->autorelease();
//返回新创建的精灵帧。
return pSpriteFrame;
}
//初始化精灵帧:参一为图集纹理,参二为对应纹理块的矩形。
bool CCSpriteFrame::initWithTexture(CCTexture2D* pobTexture, const CCRect& rect)
{
//将矩形参数转为当前设备分辨率下的像素单位的大小。
CCRect rectInPixels = CC_RECT_POINTS_TO_PIXELS(rect);
//调用参数更详细的初始化函数。
return initWithTexture(pobTexture, rectInPixels, false, CCPointZero, rectInPixels.size);
}
//初始化精灵帧:参一为图集图片名称,参二为对应纹理块的矩形。
bool CCSpriteFrame::initWithTextureFilename(const char* filename, const CCRect& rect)
{
//将矩形参数转为当前设备分辨率下的像素单位的大小。
CCRect rectInPixels = CC_RECT_POINTS_TO_PIXELS( rect );
//调用参数更详细的初始化函数。
return initWithTextureFilename(filename, rectInPixels, false, CCPointZero, rectInPixels.size);
}
//初始化精灵帧:参一为图集纹理,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉纹理块空白后所导致的锚点偏移,参五为纹理块的原始大小
bool CCSpriteFrame::initWithTexture(CCTexture2D* pobTexture, const CCRect& rect, bool rotated, const CCPoint& offset, const CCSize& originalSize)
{
//保存图集纹理
m_pobTexture = pobTexture;
//占用纹理资源,对其引用计数器加1
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 );
//保存纹理块是否旋转了90度。
m_bRotated = rotated;
return true;
}
//初始化精灵帧:参一为图集图片名称,参二为对应纹理块的矩形,参三为矩形块是否旋转,参四为去掉空白后纹理块所导致的偏移,参五为纹理块的原始大小
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 );
//保存纹理块是否旋转了90度。
m_bRotated = rotated;
return true;
}
//析构
CCSpriteFrame::~CCSpriteFrame(void)
{
CCLOGINFO("cocos2d: deallocing %p", this);
CC_SAFE_RELEASE(m_pobTexture);
}
//创建一个当前实例的拷贝
CCObject* CCSpriteFrame::copyWithZone(CCZone *pZone)
{
CC_UNUSED_PARAM(pZone);
//新创一个CCSpriteFrame实例对象。
CCSpriteFrame *pCopy = new CCSpriteFrame();
//以当前实例的各属性值为参数对其进行初始化。
pCopy->initWithTextureFilename(m_strTextureFilename.c_str(), m_obRectInPixels, m_bRotated, m_obOffsetInPixels, m_obOriginalSizeInPixels);
//设置同样的纹理图集。
pCopy->setTexture(m_pobTexture);
//返回创建的CCSpriteFrame实例对象。
return pCopy;
}
//设置当前帧所用的纹理块在图集中的矩形
void CCSpriteFrame::setRect(const CCRect& rect)
{
//保存点单位的矩形大小
m_obRect = rect;
//保存转换为像素单位的矩形大小
m_obRectInPixels = CC_RECT_POINTS_TO_PIXELS(m_obRect);
}
//设置当前帧所用的纹理块在图集中的矩形(像素单位)
void CCSpriteFrame::setRectInPixels(const CCRect& rectInPixels)
{
//保存像素单位的矩形大小
m_obRectInPixels = rectInPixels;
//保存转换为点单位的矩形大小
m_obRect = CC_RECT_PIXELS_TO_POINTS(rectInPixels);
}
//取得纹理块在合并时去掉周围空白边后的锚点偏移(点单位).
const CCPoint& CCSpriteFrame::getOffset(void)
{
return m_obOffset;
}
//设置纹理块在合并时去掉周围空白边后的锚点偏移(点单位).
void CCSpriteFrame::setOffset(const CCPoint& offsets)
{
//保存纹理块在合并时去掉周围空白边后的锚点偏移(点单位).
m_obOffset = offsets;
//保存转换为像素单位的纹理块在合并时去掉周围空白边后的锚点偏移。
m_obOffsetInPixels = CC_POINT_POINTS_TO_PIXELS( m_obOffset );
}
//取得纹理块在合并时去掉周围空白边后的锚点偏移(像素单位).
const CCPoint& CCSpriteFrame::getOffsetInPixels(void)
{
return m_obOffsetInPixels;
}
//设置纹理块在合并时去掉周围空白边后的锚点偏移(像素单位).
void CCSpriteFrame::setOffsetInPixels(const CCPoint& offsetInPixels)
{
//保存像素单位的纹理块在合并时去掉周围空白边后的锚点偏移。
m_obOffsetInPixels = offsetInPixels;
//保存转换为点单位的纹理块在合并时去掉周围空白边后的锚点偏移.
m_obOffset = CC_POINT_PIXELS_TO_POINTS( m_obOffsetInPixels );
}
//设置图集纹理
void CCSpriteFrame::setTexture(CCTexture2D * texture)
{
//删放旧图集纹理,使用新图集纹理。
if( m_pobTexture != texture ) {
CC_SAFE_RELEASE(m_pobTexture);
//对应CC_SAFE_RELEASE对引用计数器减一操作, CC_SAFE_RETAIN对引用计数器加一操作.
CC_SAFE_RETAIN(texture);
m_pobTexture = texture;
}
}
//取得图集纹理。
CCTexture2D* CCSpriteFrame::getTexture(void)
{
//如果纹理指针有效,直接返回。
if( m_pobTexture ) {
return m_pobTexture;
}
//否则查看纹理图片是否有效,如果有效,加载到纹理管理器中返回创建的纹理。
if( m_strTextureFilename.length() > 0 ) {
return CCTextureCache::sharedTextureCache()->addImage(m_strTextureFilename.c_str());
}
// 如果都无效,返回NULL。
return NULL;
}
NS_CC_END
实现类在cocos2d-x里面是可以不用看的,只看头文件就可以明白大体的用法,但有些方法要去细看其实现的话,也能加深对方法的理解,这里做了备份亦作参考。
cocos2D-x关于CCSpriteFrame的cpp实现
最新推荐文章于 2024-08-29 11:24:48 发布