適用版本: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()
。