Cocos2d-x-3.x特性變化

 Cocos2d-x-3.x特性變化   目錄 第1章字面替換 1.1 去除CC前綴 1.2 枚舉常量的封裝 1.3 單例對象的獲取 1.4 紋理緩存對象被放置到Director中 1.5 Node類的屬性函數名修改 第2章 c++11新特性 2.1 auto關鍵字 2.1.1 auto特性 2.1.2 建議 2.2 lambda表達式 2.2.1 最簡單的lambda表達式 2.2.2 定義lambda表達式函數變量 2.2.3 lambda表達式概念 2.2.4 捕捉列表 2.2.5 參數列表 2.2.6 返回值 2.2.7 代碼塊 2.3 lambda表達式在cocos2dx中的應用 2.4 std::function和std::bind   第1章  字面替換 1.1  去除CC前綴 由於cocos2d-x開發者認爲已經有命名空間來避免命名衝突,因此在3.0及其以後的版本里,標識符命名放棄了CC前綴。 比如CCSprite被改成了Sprite,CCDirector被改成了Director 1.2  枚舉常量的封裝 很多枚舉變量都進行了修改,要使用類名::枚舉名來訪問,避免衝突,比如: glview->setDesignResolutionSize(768,1280, ResolutionPolicy::EXACT_FIT  /*kResolutionExactFit*/); kResolutionExactFit已經被標記爲廢棄,建議使用新的宏ResolutionPolicy::EXACT_FIT,但是kResolutionExactFit依舊能使用,編譯時候會得到一個警告。 1.3  單例對象的獲取 在2.x中,使用sharedXXX靜態函數來獲取單例對象,比如: CCUserDefault::sharedUserDefault()->seIntergerForKey(...); 在3.x中使用 CCUserDefault::getInstance()來獲取單例對象 1.4  紋理緩存對象被放置到Director中 通過CCDirector::getTextureCache()去獲取紋理緩存 1.5  Node類的屬性函數名修改 virtualvoid setRotationSkewX(float rotationX); CC_DEPRECATED_ATTRIBUTEvirtualvoid setRotationX(floatrotationX) { return setRotationSkewX(rotationX); }   virtualRect getBoundingBox() const;     /** @deprecated Use getBoundingBox instead */     CC_DEPRECATED_ATTRIBUTEinlinevirtualRect boundingBox() const { return getBoundingBox(); }   virtualvoid setLocalZOrder(int localZOrder);       CC_DEPRECATED_ATTRIBUTEvirtualvoid setZOrder(intlocalZOrder) { setLocalZOrder(localZOrder); } 可憐常用的SetZOrder,boundingbox,全部得改了,老版本也能用,但是會被警告   第2章  c++11新特性 2.1  auto關鍵字 2.1.1  auto特性 auto i = 1; 編譯器知道i是個整數類型 auto director =Director::getInstance(); 根據getInstance的返回,編譯器知道是Director類型的指針 2.1.2  建議 建議:別濫用auto,實在不行的時候用,平時該咋地還咋地,auto寫起來比int還長一些呢,都是auto以後代碼看起來很痛苦的 2.2  lambda表達式 2.2.1  最簡單的lambda表達式 int i = []{return1;}(); 以上結果會返回1,然後賦值給i 2.2.2  定義lambda表達式函數變量 auto func = []{return 1;}; auto value = func();   如果把func替換成lambda表達式,就變成2.2.1中的樣子了。 2.2.3  lambda表達式概念 lambda表達式是一個匿名函數,格式如下: [捕捉列表](參數列表)->返回類型{代碼塊;} 其中返回類型和參數列表可以省略,所以有了以上最簡單的lambda表達式了。 2.2.4  捕捉列表 1.傳值捕獲 捕捉列表使得lambda表達式能訪問外部變量。 int func() {        intb = 1;        intc = [=b]{ b++; return b; }; } 以上lambda表達式裏,捕獲列表將b捕獲到表達式中,使得表達式可以使用變量名b。但是使用=b捕獲,是傳值捕獲,lambda中的b++不會影響fanc中的b。 在gcc中,b++的操作會報錯,應爲b在lambda中,屬於常量,但是vc比較坑爹,沒有報錯。 2.傳址捕獲 int func() {        intb = 1;        intc = [&b]{ b++; return b; }; } 使用&表示傳址捕獲,lambda表達式中的b++會使得func中的b增加1 3.捕獲多項變量 int func() {        intb = 1;        intd=1;        intc = [&b,=d]{ return ++b+d; }; } 需要捕獲多項時候,用逗號隔開 4.全捕獲 intfunc() {     int b = 1;     int d = 1;     int c = [&]{b++; d++; return b+d;} } 全部變量都被引用方式捕獲 intfunc() {     int b = 1;     int d = 1;     int c = [=]{b++; d++; return b+d;} } 以上例子,全部變量被拷貝方式捕獲,b++和d++不影響外面的變量 捕獲列表也能捕獲全局變量。 2.2.5  參數列表 參數列表和普通函數的參數列表一樣,我就不嘮叨了 2.2.6  返回值 返回值,我一般都省略了,沒啥用啊,編譯器會自動推導的。但是在某種情況下有點用,比如: autoi = []->int{return 0.5f}(); 如果沒有->int標記返回值,那麼i的類型將會是float。 2.2.7  代碼塊 跟普通函數的代碼塊沒啥區別。 2.3  lambda表達式在cocos2dx中的應用 很多回調函數都可以使用lambda來表示了,這樣可以省去很多麻煩,用之前的selector也還可以,但是會獲得一個警告。   MenuItem*item = MenuItemFont::create("Close Program", []{     Director::getInstance()->end(); }); 以上代碼示例了,如果創建一個菜單項,當點擊這個菜單時,調用了一個lambda表達式,去停止程序。 2.4  std::function和std::bind #include #include #include   int f(inti, charc, doubled) {          printf("int is %d, char is%c, dobule is %g\n", i, c, d);          returni; }   classF { public:          virtualvoid func()            {                    printf("F::func\n");          } }; classC : publicF { public:          void func() overridefinal            {                    printf("C::func\n");          } };   int main() {          // 作爲函數的包裝          std::function ff;          ff = f;          ff(1, 'c', 4);            ff = std::bind(f,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);          ff(2, 'c', 5);            std::function ff1;          ff1 = std::bind(f,std::placeholders::_1, 'c', 8);          ff1(2);            std::function ffr;          ffr = std::bind(f,std::placeholders::_3, std::placeholders::_2, std::placeholders::_1);          ffr(10.0, 'c', 1);            C c;          std::function mFunc;          mFunc = std::bind(&F::func, &c);          mFunc();            // lambda 和function,給匿名函數命名,尼瑪的,真能折騰。。。直接給個名字好不好          std::function lFunc = [](inta, intb){returna + b; };          int a = lFunc(3, 4);          printf("result is %d\n", a);            // lambda和bind和function          lFunc = std::bind([](inta, intb){returna + b; },std::placeholders::_1, std::placeholders::_2);          a = lFunc(100, 1000);          printf("result is %d\n", a);            system("pause"); }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章