cocos2d-x 3.1.1 学习笔记[18] Sprite创建之旅


//传入一个字符串来创建一个精灵
Sprite* Sprite::create(const std::string& filename)
{
    //向系统申请一块内存
    /*
        std::nothro
        在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。
        分配失败是非常普通的,它们通常在植入性和不支持异常的可移动的器件中发生更频繁。因此,应用程序开发者在这个环境中使用nothrow new来替代普通的new是非常安全的。
    */
    Sprite *sprite = new (std::nothrow) Sprite();
    //如果申请成功且初始化成功
    if (sprite && sprite->initWithFile(filename))
    {
        // 将这个sprite放到池里面
        sprite->autorelease();
        /*
            Ref* Ref::autorelease()
            {
                PoolManager::getInstance()->getCurrentPool()->addObject(this);
                return this;
            }
        */
        return sprite;
    }
    //如果创建不成功就安全的删除这个申请的内存且返回nullptr
    //#define CC_SAFE_DELETE(p)           do { delete (p); (p) = nullptr; } while(0)
    CC_SAFE_DELETE(sprite);
    return nullptr;
}


/*
    调用了Sprite::create(const std::string& filename)以后,
    函数内部会调用Sprite::initWithFile(const std::string& filename)
*/
bool Sprite::initWithFile(const std::string& filename)
{
    //断言,filename.size必须要大于0,否则就终止程序
    /*
        Assert - 断言
      使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言。
      除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。
    */
    CCASSERT(filename.size()>0, "Invalid filename for sprite");
    // 由名字获取到相关图片的Textture
    Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
    // 如果获取到 Textture
    if (texture)
    {
        Rect rect = Rect::ZERO;
        rect.size = texture->getContentSize();
        // 调用指定的初始化
        return initWithTexture(texture, rect);
    }
    // 如果没获取到 Textture
    // don't release here.
    // when load texture failed, it's better to get a "transparent" sprite then a crashed program
    // this->release();
    return false;
}

/*
    调用了bool Sprite::initWithFile(const std::string& filename)以后,
    函数内部会调用bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect)
    bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect)
    {
        return initWithTexture(texture, rect, false);
    }
    之后他调用了自己的另一个重载函数bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect, bool rotated)
*/

// designated initializer
bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect, bool rotated)
{
    bool result;
    if (Node::init())
    /*
        为什么可以通过类名直接访问这个方法?因为Sprite继承Node,所以Sprite内部可以调用Node::init();
        为什么两个函数都被执行了?其实只是一个函数执行了 Sprite::create(void) 中间会调用 Sprite::init();
        父类这个函数只返回true
        virtual bool in
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值