加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x 两阶段构造器以及静态create()函数

发布时间:2020-12-14 19:14:33 所属栏目:百科 来源:网络整理
导读:cocos2d-x 两阶段构造器以及静态create()函数 第一阶段是运行C++类构造器。在C++类的默认构造器中,成员变量须设定为默认值。但我们不应该在默认构造器中编写任何逻辑。例如: MyClass::MyClass():_data(NULL) //C++ class constructor,_flag(false) //set a

cocos2d-x 两阶段构造器以及静态create()函数


第一阶段是运行C++类构造器。在C++类的默认构造器中,成员变量须设定为默认值。但我们不应该在默认构造器中编写任何逻辑。例如:

MyClass::MyClass()
:_data(NULL)  //C++ class constructor,_flag(false)    //set all member variables to default values,_count(0)
{
      memset(_array,sizeof(_array));//only set default values here,but not logics
}

我们之所以不应在这里编写任何逻辑,是因为C++默认构造函数不能返回表明我们逻辑正确与否的bool值。

使用C++关键词try/catch(捕获/异常)同样会给调用方返回失败状态,但是使用try/catch(捕获/异常)显然将增加你源代码编译后的二进制文件的大小。


第二阶段是:调用MyClass::init()函数,如下:

bool MyClass::initWithFilename(const std::string& filename)
{
    // just take loading texture as a sample,this behaviour can fail if the image
    bool bReturnValue = laodTextureIntoMemory(filename);
    return bReturnValue;
}

所以,我们可以构建如下:
MyClass* obj = new MyClass;
if (true == obj->initWithFilename("texture.png"))
{
    // congratulations,go ahead!
}
else
{
    // error process
}

在cocos2d-x引擎中,我们已对这一两阶段构造器进行包装,并在静态函数create()中自动释放引用计数。除了单例模式,每一个cocos2d类都有自己的static CCClass*::create(...)方法。极力推荐这一方法。代码例子如下:

Sprite* monster = Sprite::create("Monster.png");
    monster->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
    this->addChild(monster);

所以,如果你希望新建cocos2d的对象,比如SPrite,Label,Action,你必须首先从头文件或API文件中找到它的CocosClass::create()方法。


doSomeThing()

这是最常见的函数名,在Cocos2d-x/-html5引擎中处处都有应用到。第一个字是一个动词,第二个字是一个名词。比如:

Director::getInstance()->replaceScene(Scene*) 和 getTexture()。

doWithResource()

它是doSomeThing()方法的变体。在

initWithTexture(CCTexture*) 和 initWithFilename(const std::string&)
中,你经常可以看到这一函数名。

onEventCallBack()

当你看到类似 void onEnter() 的函数名时,onAction类型表明这是一个回调函数。当引发一定条件时,其他类将调用这一方法。比如:

class Layer
    {
    public:
        virtual void onEnter();
        virtual void onExit();
        virtual void onEnterTransitionDidFinish();
    };

getInstance()

在cocos2d-x引擎中,如果你没有发现create(),只发现了getInstance()方法,它就属于单例模式类。比如:TextureCache::getInstance()。单例类对应的析构方式是destroyInstance()。在V3.0之前,单例类的构造方式是CocosClass::sharedCocosClass(),比如:TextureCache::sharedTextureCache()。这个方法在V3.0中仍然可以兼容,但不保证V3.0更后面的版本中仍然保留。


属性

因为在C++和C++11中没有“property”(“属性”)这个概念,所以我们在cocos2d-x引擎中使用了许多getter 和setters。

setProperty()

改变属性的值。这通常会影响到对象的行为。比如_sprite->setPosition(ccp(0,0)) 会将精灵移动到左下角。

getProperty()

与setProperty 不同,getProperty将不会改变对象的成员变量及行为。比如,我们通常使用_director->getVisibleSize().width 获得可见窗口大小以计算对象的方位。

getProperty() 函数默认类型如下:

const Size& getSize() const;
首先,根据性能优化,在此,我们返回Size引用,而不是构建另一个Size。当改变这一Size&时,该对象的内部成员变量将会受到影响,所以这一Size&属于常量。

第二,getSize()方法不应该改变该对象的其他成员变量,所以这一函数本身属于常量。

isProperty()

和getProperty一样,但会返回一个boolean值。

总结起来:

·如果属性为“只读”,将不会有setProperty(type)方法;

·如果属性为一个bool值,将会有setProperty(bool) 以及isProperty()方法。比如:Sprite::isDirty() 和 Sprite::setDirty(bool bDirty)。

·如果属性不是一个bool值,将会有setProperty(type)和getProperty()方法。比如:void Sprite::setTexTure(Texture2D*) 和 Texture2D* CCSprite::getTexture().


本文来自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/easy-to-learn-api-style/zh.md,略加修改

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读