您好,登錄后才能下訂單哦!
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<cstdio> #include<cstdlib> #include<functional> 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<int(int, char, double)> 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<int(int)> ff1; ff1 = std::bind(f,std::placeholders::_1, 'c', 8); ff1(2); std::function<int(double, char, int)> ffr; ffr = std::bind(f,std::placeholders::_3, std::placeholders::_2, std::placeholders::_1); ffr(10.0, 'c', 1); C c; std::function<void()> mFunc; mFunc = std::bind(&F::func, &c); mFunc(); // lambda 和function,給匿名函數命名,尼瑪的,真能折騰。。。直接給個名字好不好 std::function<int(int, int)> 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"); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。