關於COCOS2d裡CCArray使用時的一點

2021-07-06 00:16:56 字數 1056 閱讀 6345

今天在安裝網上的教程寫塔防小遊戲的時候遇到一點問題,原文中是用cocos 3.x的**寫的,而由於我用的是2.x(破電腦編譯3.x速度實在難以忍受),所以很多小地方都需要修改。

其中有乙個3.x新加的vector(node*)型別,我在2.x裡找不到對應的型別,以為跟std::vector(ccnode*)應該差不多,所以就直接替代著用了,編譯倒是沒有報錯,可是每次一執行就gg了。後來發現原來是std::vecor儲存的指標對應的內存在執行時被自動釋放了,猜測估計是vector型別會自動對記憶體進行retain操作。於是換個型別,想著用cocos自帶型別或許會好點,所以就改為ccarray,沒想到還是同樣的問題。上網一查,果然ccarray被其他類引用的時候並不會自動增加引用值,需要手動retain,於是在引用的時候呼叫retain(),析構的時候呼叫release(),解決問題。

我是分隔符/// 

上面是用的淺拷貝的方法,今天突然想到或許用深拷貝會更好,於是找到了ccarray中有這樣乙個函式createwitharray(),馬上動手試了一下,沒想到又遇到了各種報錯。深入檢視原始碼發現,這個函式呼叫的是基類的copy函式。部分**如下:

ccobject* ccobject::copy()

ccobject* cccopying::copywithzone(cczone *pzone)

ccarray* ccarray::createwitharray(ccarray* otherarray)

ccobject* ccarray::copywithzone(cczone* pzone)

return parray;

}

可以看到基類ccobject中對copy只是做了簡單的報錯處理,而實際執行的時候呼叫的是ccarray中重新寫的虛函式copywithzone,這看起來似乎沒什麼問題,在copywithzone中重新開闢了記憶體並把成員也複製過來,都是深拷貝,但是我執行的時候還是報錯了。原來是因為我的ccarray裝的是ccnode物件,而我看了一下ccnode類的源**,發現ccnode中並公尺有對copywithzone函式進行重寫,所以複製成員的時候呼叫的是基類的中函式,所以報錯。

cocos2d實現語音 Cocos2d 聲音API

param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...

Cocos2D研究院之初識Cocos2d(二)

在正式介紹cocos2d之前,我先囉嗦一下本人對這套引擎的看法。我認為coos2d最大的作用就是降低開發成本 貌似所有引擎都是這樣 對於研發部門來說,最大的成本就是時間,所以節省時間是降低成本最有效的方式,cocos2d幾乎封裝了所有開發ios遊戲需要的底層 使剛剛接觸oc的開發者也能很快的製作出效...

Cocos2D研究院之初識Cocos2d(二)

在正式介紹cocos2d之前,我先囉嗦一下本人對這套引擎的看法。我認為coos2d最大的作用就是降低開發成本 貌似所有引擎都是這樣 對於研發部門來說,最大的成本就是時間,所以節省時間是降低成本最有效的方式,cocos2d幾乎封裝了所有開發ios遊戲需要的底層 使剛剛接觸oc的開發者也能很快的製作出效...