博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CCSpriteFrameCache精灵帧缓存分析(3):CCSpriteFrame分析
阅读量:4216 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
轩辕实验室丨欧盟EVITA项目预研 第一章(二)
查看>>
轩辕实验室丨欧盟EVITA项目预研 第一章(三)
查看>>
专利 | 一种基于深度学习的车载CAN总线入侵检测方法
查看>>
VCU解决方案及核心L9788复杂驱动功能安全审计启动
查看>>
助力“探月工程”的单元测试工具可10倍提升测试效率
查看>>
构建实时数仓 - 当 TiDB 偶遇 Pravega
查看>>
TiDB 容器化部署面面观丨「能量钛」圆桌论坛回顾
查看>>
TiDB 在网易游戏的应用实践
查看>>
迁移实战:Discourse 从 PostgreSQL 到 MySQL 到 TiDB丨AskTUG 论坛背后的故事
查看>>
TiDB Operator 源码阅读 (四) 组件的控制循环
查看>>
TiDB 5.1 发版,打造更流畅的企业级数据库体验
查看>>
2020-11-04
查看>>
OC笔记NSDate
查看>>
求两个分数的加减乘除,并比较大小
查看>>
day1: Objective-C概述、面向对象编程、类和对象、实例变量操作
查看>>
day2:实例变量可见度、方法、setter、getter
查看>>
day3: 继承、初始化方法、便利构造器
查看>>
day4_1: NSString 和 NSMutableString 的使用
查看>>
day4_2: 数组NSArray NSMutableArray、值对象NSNumber、NSValue
查看>>
day5: 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序
查看>>