中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Cocos2d-x-3.x特性變化

發布時間:2020-06-15 23:17:01 來源:網絡 閱讀:484 作者:libinqi456 欄目:游戲開發
 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");
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保德县| 大英县| 湄潭县| 富顺县| 青海省| 太康县| 墨竹工卡县| 汉川市| 灵宝市| 固镇县| 于都县| 卢龙县| 巩留县| 疏勒县| 封开县| 封丘县| 延吉市| 武川县| 昆明市| 昌图县| 乌鲁木齐市| 富源县| 通化市| 大足县| 安宁市| 桦甸市| 抚顺县| 沾益县| 北流市| 贡觉县| 葵青区| 互助| 南溪县| 青龙| 剑川县| 香格里拉县| 福海县| 綦江县| 卢龙县| 白朗县| 长沙县|