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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。