1. 程式人生 > >【cocos2d-x】建構函式與初始化

【cocos2d-x】建構函式與初始化

出自圖書《製作自己的捕魚達人》

在cocos2d-x中建立物件的方法與C++開發者的習慣不同,在C++中,我們只需要呼叫類的建構函式即可建立一個物件,即可直接建立一個棧上的值物件,

       也可以使用new操作符建立一個指標,指向堆上的物件,而在cocos2d-x中,無論是建立物件的型別,還是建立物件的方法,都是與C++不同的。

       cocos2d-x不使用傳統的值型別,所有的物件都建立在堆上,然後通過指標引用。建立cocos2d-x物件通常有2種方法:第一種是首先使用new操作符創造一個未初始化的物件,

       然後呼叫init系列方法來初始化;第二種是使用靜態的工場方法直接建立一個物件。下面我們首先介紹第一種方法

       在Objective-C中並沒有建構函式,建立一個物件需要先為物件分配記憶體,然後呼叫初始化方法來初始化物件,這個過程就等價於C++中的建構函式。與Objective-C一樣,

       Cocos2d-x也採用了這個步驟。Cocos2d-x類的建構函式通常沒有引數,建立物件所需的引數通過init開頭的一系列初始化方法傳遞給物件。建立物件的步驟如下所示。

       (1)使用new操作符呼叫建構函式,建立一個沒有初始化過的空物件。

       (2)選擇合適的初始化方法,並呼叫它來初始化物件。

       Cocos2d-x的初始化方法都以init作為字首,因此可以輕易辨認出來。初始化方法返回一個布林值,代表是否成功初始化該物件。下面我們提供一個從檔案初始化精靈(CCSprite)的例子:

       CCSprite*sprite1 = new CCSprite();

       sprite1->initWithFile("HelloWorld.png");

       在這個例子中,我們首先呼叫建構函式建立一個未經初始化的CCSprite物件,然後在CCSprite提供的8個初始化方法中選擇了從檔案建立精靈的初始化方法CCSprite::init WithFile(const char* filename)來初始化精靈。

       第二種方法則是使用類自帶的工廠方法來建立物件。在Cocos2d-x中,許多類會自帶一系列工廠方法,這些工廠方法是類提供的靜態函式。只要提供必要的引數,就會返回一個完成了初始化的物件。

       通常init系列的初始化方法都會有其對應的工廠方法,它們的名稱類似,引數一致,都可以用於建立物件。在Cocos2d-x的舊版本中,工廠方法通常以類的名稱(不包含字首)開頭,

       而在Cocos2d-x 2.0及後續版本中,工廠方法的名稱統一為create。在名稱衝突的情況下,也可能採用以create作為字首的其他函式名。

       我們仍然以建立精靈為例,下面的兩條語句等價,前者為引擎舊版本中的方法,後者為新版本中的方法,它們都會建立一個與第一種方法所述類似的精靈:

       CCSprite*sprite2 = CCSprite::spriteWithFile("HelloWorld.png");

       CCSprite*sprite3 = CCSprite::create("HelloWorld.png");

       這兩種方法都可以建立Cocos2d-x物件,然而它們在記憶體管理方面還是有一點點差異的。使用建構函式建立的物件,它的所有權已經屬於呼叫者了,

       使用工廠方法建立的物件的所有權卻並不屬於呼叫者,因此,使用建構函式建立的物件需要呼叫者負責釋放,而使用工廠方法建立的物件則不需要。我們將在2.3.4節詳細介紹它們的區別。

       在遊戲中,我們需要不斷地建立新的遊戲元素,通常採取的方法是從Cocos2d-x提供的遊戲元素類派生出新的類,並在初始化方法中建立好我們所需的遊戲元素。

       這個過程與微軟.NET框架下的Windows Form開發類似。例如在Hello World中,我們從CCLayer類派生出HelloWorld類(這是一個層),並重載了HelloWorld類的init()方法,

       在這個方法中為HelloWorld層新增內容。為了保證初始化方法可以被子類過載,需要確保初始化方法宣告為虛擬函式:

       virtualbool init();

       作為參考,我們提供一個典型的init()方法框架如下:

       boolinit()

       {

       if(CCLayer::init())

       {

       //在此處寫入初始化這個類所需的程式碼

       returntrue;

       }

       returnfalse;

       }