Cocos API風格說明(摘自官方文檔)

適用版本:v3.0-beta2及更高版本

兩階段構造器及靜態create()函數

在Cocos2d-x引擎中,我們使用了兩階段構造器,這不僅指Objective-C實現文件(implementation),也與Symbian SDK及Bada SDK相似。我認爲這一舉措在C++編程中很不錯。

第一階段是運行C++類構造器。在C++類的默認構造器中,成員變量須設定爲默認值。但我們不應在默認構造器中編寫任何邏輯。例如

MyClass::MyClass()  // c++ class constructor
:_data(NULL)      // set all member variables to default values
,_flag(false)
,_count(0)
{
    memset(_array, 0, 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 file doesn't  exist. 
    bool bReturnValue = loadTextureIntoMemory(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* CCClass::create(...)方法。極力推薦這一方法。代碼樣本:

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

所以,如果你希望新建cocos2d的對象,比如Sprite, Label, Action,你必須首先從頭文件或API文件中找到它的CocosClass::create() 方法。

doSomething()

這是最常見的函數名,在Cocos2d-x/-html5引擎中處處都有應用到。第一個字是一個動詞,第二個字是一個名詞。比如:replaceScene(CCScene*) 和 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 CCSize& getSize() const;

首先,根據性能優化,在此,我們返回CCSize引用,而不是構建另一個CCSize。當改變這一CCSize&時,該對象的內部成員變量將會受到影響,所以這一CCSize&屬於常量。

第二,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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章