//传入一个字符串来创建一个精灵
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