Cocos2d-x-3.x特性变化目录第1章字面替换1.1去除CC前缀1.2枚举常量的封装1.3单例对象的获取1.4纹理缓存对象被放置到Director中1.5Node类的属性函数名修改第2章c++11新特性2.1auto关键字2.1.1auto特性2.1.2建议2.2lambda表达式2.2.1最简单的lambda表达式2.2.2定义lambda表达式函数变量2.2.3lambda表达式概念2.2.4捕捉列表2.2.5参数列表2.2.6返回值2.2.7代码块2.3lambda表达式在cocos2dx中的应用2.4std::function和std::bind第1章字面替换1.1去除CC前缀由于cocos2d-x开发者认为已经有命名空间来避免命名冲突,因此在3.0及其以后的版本里,标识符命名放弃了CC前缀。比如CCSprite被改成了Sprite,CCDirector被改成了Director1.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.5Node类的属性函数名修改virtualvoidsetRotationSkewX(floatrotationX);CC_DEPRECATED_ATTRIBUTEvirtualvoidsetRotationX(floatrotationX){returnsetRotationSkewX(rotationX);}virtualRectgetBoundingBox()const;/**@deprecatedUsegetBoundingBoxinstead*/CC_DEPRECATED_ATTRIBUTEinlinevirtualRectboundingBox()const{returngetBoundingBox();}virtualvoidsetLocalZOrder(intlocalZOrder);CC_DEPRECATED_ATTRIBUTEvirtualvoidsetZOrder(intlocalZOrder){setLocalZOrder(localZOrder);}可怜常用的SetZOrder,boundingbox,全部得改了,老版本也能用,但是会被警告第2章c++11新特性2.1auto关键字2.1.1auto特性autoi=1;编译器知道i是个整数类型autodirector=Director::getInstance();根据getInstance的返回,编译器知道是Director类型的指针2.1.2建议建议:别滥用auto,实在不行的时候用,平时该咋地还咋地,auto写起来比int还长一些呢,都是auto以后代码看起来很痛苦的2.2lambda表达式2.2.1最简单的lambda表达式inti=[]{return1;}();以上结果会返回1,然后赋值给i2.2.2定义lambda表达式函数变量autofunc=[]{return1;};autovalue=func();如果把func替换成lambda表达式,就变成2.2.1中的样子了。2.2.3lambda表达式概念lambda表达式是一个匿名函数,格式如下:[捕捉列表](参数列表)->返回类型{代码块;}其中返回类型和参数列表可以省略,所以有了以上最简单的lambda表达式了。2.2.4捕捉列表1.传值捕获捕捉列表使得lambda表达式能访问外部变量。intfunc(){intb=1;intc=[=b]{b++;returnb;};}以上lambda表达式里,捕获列表将b捕获到表达式中,使得表达式可以使用变量名b。但是使用=b捕获,是传值捕获,lambda中的b++不会影响fanc中的b。在gcc中,b++的操作会报错,应为b在lambda中,属于常量,但是vc比较坑爹,没有报错。2.传址捕获intfunc(){intb=1;intc=[&b]{b++;returnb;};}使用&表示传址捕获,lambda表达式中的b++会使得func中的b增加13.捕获多项变量intfunc(){intb=1;intd=1;intc=[&b,=d]{return++b+d;};}需要捕获多项时候,用逗号隔开4.全捕获intfunc(){intb=1;intd=1;intc=[&]{b++;d++;returnb+d;}}全部变量都被引用方式捕获intfunc(){intb=1;intd=1;intc=[=]{b++;d++;returnb+d;}}以上例子,全部变量被拷贝方式捕获,b++和d++不影响外面的变量捕获列表也能捕获全局变量。2.2.5参数列表参数列表和普通函数的参数列表一样,我就不唠叨了2.2.6返回值返回值,我一般都省略了,没啥用啊,编译器会自动推导的。但是在某种情况下有点用,比如:autoi=[]->int{return0.5f}();如果没有->int标记返回值,那么i的类型将会是float。2.2.7代码块跟普通函数的代码块没啥区别。2.3lambda表达式在cocos2dx中的应用很多回调函数都可以使用lambda来表示了,这样可以省去很多麻烦,用之前的selector也还可以,但是会获得一个警告。MenuItem*item=MenuItemFont::create("CloseProgram",[]{Director::getInstance()->end();});以上代码示例了,如果创建一个菜单项,当点击这个菜单时,调用了一个lambda表达式,去停止程序。2.4std::function和std::bind#include<cstdio>#include<cstdlib>#include<functional>intf(inti,charc,doubled){printf("intis%d,charis%c,dobuleis%g\n",i,c,d);returni;}classF{public:virtualvoidfunc(){printf("F::func\n");}};classC:publicF{public:voidfunc()overridefinal{printf("C::func\n");}};intmain(){//作为函数的包装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);Cc;std::function<void()>mFunc;mFunc=std::bind(&F::func,&c);mFunc();//lambda和function,给匿名函数命名,尼玛的,真能折腾。。。直接给个名字好不好std::function<int(int,int)>lFunc=[](inta,intb){returna+b;};inta=lFunc(3,4);printf("resultis%d\n",a);//lambda和bind和functionlFunc=std::bind([](inta,intb){returna+b;},std::placeholders::_1,std::placeholders::_2);a=lFunc(100,1000);printf("resultis%d\n",a);system("pause");}