cocos2d-x知识总结
1. CCMoveTo動作運行多次,位置會發(fā)生詭異的變化,比如變成目標(biāo)位置的幾倍。解決辦法,確保每次CCMoveTo之前停止之前的動作。
2. 在onEnter()函數(shù)中,忘記調(diào)用父類的onEnter()函數(shù)會導(dǎo)致動畫等無效。還有在init()函數(shù)中,謹(jǐn)記要對父類進(jìn)行初始化。
3. addChild(CCNode* child, int zOrder); zOrder的值越大,顯示的位置越靠前。
4. 兩個常用命名空間宏:
#define??USING_NS_CC?using?namespace?cocos2d #define?USING_NS_CC_EXT?using?namespace?cocos2d::extensionCocos2d-x提供的日志輸出函數(shù):CCLOG
5. CC_BREAK_IF:
#define?CC_BREAK_IF(cond)????????????if(cond)?break6. 關(guān)于do…while(0)或do…while(false)語句的一些特殊作用:
(1)提高代碼健壯性。
情況一,代碼執(zhí)行中提前退出函數(shù),不執(zhí)行循環(huán)體中后面的部分代碼,轉(zhuǎn)而直接執(zhí)行循環(huán)體外后面的代碼,當(dāng)然用goto語句也可以實現(xiàn)這一目的。
some?code… do{ CC_BREAK_IF(?如果出錯,跳出while循環(huán)); //…另一些語句,如果跳出循環(huán)后,這些語句將不會執(zhí)行,從而執(zhí)行循環(huán)體外后面的代碼 }?while(0); some?code…(2)用于宏定義,#define MARCRO(para) do{macro content}while(0)的格式,原因如下:
a、避免空的宏定義產(chǎn)生warning,如:#define fun() do{}while(0);
b、存在一個獨立的block,可用來進(jìn)行變量定義,進(jìn)行復(fù)雜實現(xiàn);
c、如果出現(xiàn)在判斷語句過后的宏,用do{}while(0)包起來可以保證宏作為一個整體來實現(xiàn),如:
#define?fun()??/ fun1();?/ fun2(); if(?cond?==?true) fun();在上面情況使用以上宏,就會導(dǎo)致fun1()和fun2()不會被同時執(zhí)行的情況,不符合預(yù)期目的。
d、以上情況使用單獨的{}包括宏也可以實現(xiàn)預(yù)期目的,但是為什么一定要用do{}while(0)?
#define?swap(x,?y)?{int?tmp;?tmp?=?x;?x?=?y;?y?=?tmp;?} if(x?>?y) swap(x,?y); else otherfun();以上代碼會因為多出一個分號報錯。 而使用do{}while(0)語句包起來,成為一個獨立的語法單元,避免與上下文混淆。而且絕大多數(shù)編譯器都能識別do{}while(0)這種無用的循環(huán)并進(jìn)行優(yōu)化,所以這樣使用不會導(dǎo)致程序的性能降低。當(dāng)然,養(yǎng)成在每個判斷語句后加上{}的習(xí)慣也能解決該問題。但是,在設(shè)計library的時候,不能指望library的使用者會有這種代碼規(guī)范習(xí)慣,要提高程序的健壯性,避免編譯出錯。
7.C++中單例的實現(xiàn)
classDataManager { private: DataManager();?//構(gòu)造函數(shù)定義為私有,防止外部調(diào)用 ~DataManager(); public: staticDataManager*?instance(); staticvoiddestroyInstance(); } DataManager::DataManager() { } DataManager::~DataManager() { } staticDataManager*?gDataManager?=?NULL; DataManager*?DataManager::instance()?{ if(!gDataManager)?{ gDataManager?=?newDataManager(); } returngDataManager; } voidDataManager::destroyInstance() { if(gDataManager)?{ deletegDataManager; gDataManager?=?NULL; } } 8、Cocos2d-x的內(nèi)存管理機制基本跟Objective-C語言一樣,都是采用引用計數(shù)的內(nèi)存管理機制。Cocos2d-x一般采用autorelease()即自動釋放的對象,Cocos2d-x將會在每一幀結(jié)束后釋放一次內(nèi)存池,并在下一幀開始前創(chuàng)建一個新的回收池,回收池維護(hù)著一個自動釋放操作的對象列表,如果一幀內(nèi)生成了大量autorelease對象,會導(dǎo)致性能下降。因此,在生成autorelease對象密集的區(qū)域(通常是循環(huán)中)的前后,我們最好可以手動創(chuàng)建并釋放一個回收池,并且如果循環(huán)數(shù)過大,可以將每次循環(huán)都創(chuàng)建并釋放一次回收池。 //情況一: CCArray*?strArray?=?CCArray::createWithCapacity(0); CCPoolManager::sharedPoolManager()->push();?//壓入一個自動回收池到回收池棧的頂端,autorelease對象僅會添加到頂端的池中 for(inti?=?0;?i?<?1000;?i?++)?{ CCString*?str?=?CCString::createWithFormat(“%d”,i); strArray->addObject(str); } CCPoolManager::sharedPoolManager()->pop();??//頂層的回收池釋放,內(nèi)部所有對象被釋放一次,此后出現(xiàn)的autorelease對象則添加都下一個池中 //情況二: CCArray*?strArray?=?CCArray::createWithCapacity(0); for(inti?=?0;?i?<?100000000;?i?++)?{ CCPoolManager::sharedPoolManager()->push(); CCString*?str?=?CCString::createWithFormat(“%d”,i); strArray->addObject(str); CCPoolManager::sharedPoolManager()->pop(); }一般函數(shù)的返回值都用autorelease對象。
9、跟Objectiv-C的屬性對象賦值一樣,Cocos2d-x的set方法賦值也要注意內(nèi)存的管理
voidAClass::setObject(CCObject*?pObj) { this->object->autorelease(); pObj->retain(); this->object?=?pObj; } voidAClass::setObject(CCObject*?pObj) { if(this->object?!=?pObj)?{ this->object->release(); pObj->retain(); this->object?=?pObj; } }10、一些內(nèi)存管理的宏:
- CC_SAFE_DELETE(p) ?//delete一個C++對象p,如果p為NULL則不操作,下同
- CC_SAFE_DELETE_ARRAY(p) //delete[]一個C++數(shù)組p
- CC_SAFE_FREE(p)
- CC_SAFE_RELEASE(p)
- CC_SAFE_RELEASE_NULL(p)
- CC_SAFE_RETAIN(p)
11、Cocos2d-x提供了一套類似Objective-C語言的容器類,CCArray、CCDictionary,用法也基本跟Objective-c的NSMutableArray,NSMutableDictionary一樣。還提供了CCARRAY_FOREACH(__array__, ?__object__)函數(shù)方便遍歷CCArray.
12、導(dǎo)演、場景、層、精靈、紋理:導(dǎo)演是控制游戲流程的主要組件,游戲流程控制通過在場景間的切換實現(xiàn),通常,場景包含層,層包含精靈,場景與層是其他游戲元素的容器,層處理觸摸事件、加速度計事件、鍵盤輸入事件,而精靈是展示給玩家的圖形,紋理是圖片。
節(jié)點和渲染樹:一切可以顯示的游戲元素都是渲染樹的節(jié)點。
動作:作用于游戲元素,規(guī)定了游戲元素運動的方式。幀動畫是作用于精靈的一種特殊動作。
13、Cocos2d-x中存在兩種坐標(biāo)系,一種是繪圖坐標(biāo)系,與OpenGL采用的坐標(biāo)系相同,以左下角為原點,向右為x軸正向,向上為y軸正向;另外一種坐標(biāo)系是紋理坐標(biāo)系,紋理坐標(biāo)系以左上角為坐標(biāo)原點,向右為x軸正向,向下為y軸正向,只有從紋理中截取部分矩形時才使用這個坐標(biāo)系。
14、錨點AnchorPoint用于設(shè)置一個描點,取值為0到1之間的實數(shù),表示錨點相對于節(jié)點長寬的位置。錨點(0,0)表示錨點在節(jié)點左下角,(1,1)表示錨點在節(jié)點右上角
15、定時器事件:(1)CCNode的update()方法,每幀都會調(diào)用 (2)CCNode的schedule()方法
16、onEnter() 當(dāng)此節(jié)點所在場景即將呈現(xiàn)時,會調(diào)用此方法。
- onEnterTransitionDidFinish() 當(dāng)此節(jié)點所在場景的入場動作結(jié)束后,會調(diào)用此方法。如果所在場景沒有入場動作,則此方法會緊接著onEnter()后被調(diào)用
- onExit()當(dāng)此節(jié)點所在場景即將退出時調(diào)用
- onExitTranshitionDidStart() 當(dāng)此節(jié)點所在的出場動作結(jié)束后會調(diào)用此方法。如果所在場景沒有出場動作,則此方法會緊接著onExit()后被調(diào)用。
17、特殊的CCLayer:
- CCLayerColor:帶背景色的層
- CCLayerGradient:能設(shè)置兩種漸變色的層
- CCMenu:游戲菜單,分為菜單項和菜單本身,CCMenuItem是一個菜單項,相當(dāng)于一個按鈕。
轉(zhuǎn)載于:https://www.cnblogs.com/Anzhongliu/p/6091807.html
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x知识总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三步教你手动破解网易云音乐加密
- 下一篇: uboot中的mmc命令