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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.