日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x知识总结

發布時間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d-x知识总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. CCMoveTo動作運行多次,位置會發生詭異的變化,比如變成目標位置的幾倍。解決辦法,確保每次CCMoveTo之前停止之前的動作。

2. 在onEnter()函數中,忘記調用父類的onEnter()函數會導致動畫等無效。還有在init()函數中,謹記要對父類進行初始化。

3. addChild(CCNode* child, int zOrder); zOrder的值越大,顯示的位置越靠前。

4. 兩個常用命名空間宏:

#define??USING_NS_CC?using?namespace?cocos2d #define?USING_NS_CC_EXT?using?namespace?cocos2d::extension

Cocos2d-x提供的日志輸出函數:CCLOG

5. CC_BREAK_IF:

#define?CC_BREAK_IF(cond)????????????if(cond)?break

6. 關于do…while(0)或do…while(false)語句的一些特殊作用:

(1)提高代碼健壯性。

情況一,代碼執行中提前退出函數,不執行循環體中后面的部分代碼,轉而直接執行循環體外后面的代碼,當然用goto語句也可以實現這一目的。

some?code… do{ CC_BREAK_IF(?如果出錯,跳出while循環); //…另一些語句,如果跳出循環后,這些語句將不會執行,從而執行循環體外后面的代碼 }?while(0); some?code…

(2)用于宏定義,#define MARCRO(para) do{macro content}while(0)的格式,原因如下:

a、避免空的宏定義產生warning,如:#define fun() do{}while(0);

b、存在一個獨立的block,可用來進行變量定義,進行復雜實現;

c、如果出現在判斷語句過后的宏,用do{}while(0)包起來可以保證宏作為一個整體來實現,如:

#define?fun()??/ fun1();?/ fun2(); if(?cond?==?true) fun();

在上面情況使用以上宏,就會導致fun1()和fun2()不會被同時執行的情況,不符合預期目的。

d、以上情況使用單獨的{}包括宏也可以實現預期目的,但是為什么一定要用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)語句包起來,成為一個獨立的語法單元,避免與上下文混淆。而且絕大多數編譯器都能識別do{}while(0)這種無用的循環并進行優化,所以這樣使用不會導致程序的性能降低。當然,養成在每個判斷語句后加上{}的習慣也能解決該問題。但是,在設計library的時候,不能指望library的使用者會有這種代碼規范習慣,要提高程序的健壯性,避免編譯出錯。

7.C++中單例的實現

classDataManager { private: DataManager();?//構造函數定義為私有,防止外部調用 ~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的內存管理機制基本跟Objective-C語言一樣,都是采用引用計數的內存管理機制。Cocos2d-x一般采用autorelease()即自動釋放的對象,Cocos2d-x將會在每一幀結束后釋放一次內存池,并在下一幀開始前創建一個新的回收池,回收池維護著一個自動釋放操作的對象列表,如果一幀內生成了大量autorelease對象,會導致性能下降。因此,在生成autorelease對象密集的區域(通常是循環中)的前后,我們最好可以手動創建并釋放一個回收池,并且如果循環數過大,可以將每次循環都創建并釋放一次回收池。 //情況一: 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();??//頂層的回收池釋放,內部所有對象被釋放一次,此后出現的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(); }

一般函數的返回值都用autorelease對象。

9、跟Objectiv-C的屬性對象賦值一樣,Cocos2d-x的set方法賦值也要注意內存的管理

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、一些內存管理的宏:

  • CC_SAFE_DELETE(p) ?//delete一個C++對象p,如果p為NULL則不操作,下同
  • CC_SAFE_DELETE_ARRAY(p) //delete[]一個C++數組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__)函數方便遍歷CCArray.

12、導演、場景、層、精靈、紋理:導演是控制游戲流程的主要組件,游戲流程控制通過在場景間的切換實現,通常,場景包含層,層包含精靈,場景與層是其他游戲元素的容器,層處理觸摸事件、加速度計事件、鍵盤輸入事件,而精靈是展示給玩家的圖形,紋理是圖片。

節點和渲染樹:一切可以顯示的游戲元素都是渲染樹的節點。

動作:作用于游戲元素,規定了游戲元素運動的方式。幀動畫是作用于精靈的一種特殊動作。

13、Cocos2d-x中存在兩種坐標系,一種是繪圖坐標系,與OpenGL采用的坐標系相同,以左下角為原點,向右為x軸正向,向上為y軸正向;另外一種坐標系是紋理坐標系,紋理坐標系以左上角為坐標原點,向右為x軸正向,向下為y軸正向,只有從紋理中截取部分矩形時才使用這個坐標系。

14、錨點AnchorPoint用于設置一個描點,取值為0到1之間的實數,表示錨點相對于節點長寬的位置。錨點(0,0)表示錨點在節點左下角,(1,1)表示錨點在節點右上角

15、定時器事件:(1)CCNode的update()方法,每幀都會調用 (2)CCNode的schedule()方法

16、onEnter() 當此節點所在場景即將呈現時,會調用此方法。

  • onEnterTransitionDidFinish() 當此節點所在場景的入場動作結束后,會調用此方法。如果所在場景沒有入場動作,則此方法會緊接著onEnter()后被調用
  • onExit()當此節點所在場景即將退出時調用
  • onExitTranshitionDidStart() 當此節點所在的出場動作結束后會調用此方法。如果所在場景沒有出場動作,則此方法會緊接著onExit()后被調用。

17、特殊的CCLayer:

  • CCLayerColor:帶背景色的層
  • CCLayerGradient:能設置兩種漸變色的層
  • CCMenu:游戲菜單,分為菜單項和菜單本身,CCMenuItem是一個菜單項,相當于一個按鈕。

轉載于:https://www.cnblogs.com/Anzhongliu/p/6091807.html

總結

以上是生活随笔為你收集整理的cocos2d-x知识总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。