大佬教程收集整理的这篇文章主要介绍了2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1打开建好的T32 Cocos2dx-3.2的一个项目
2设置Cocos显示窗口的位置是在AppDelegate.cpp中:
3 设置自适应窗口大小的代码是在上面的代码后面紧接着就添加:
glview->setDesignResolutionSize(480,320,ResolutionPolicy::EXACT_FIT);
3cocos2d-x-3.2项目案例(3.2版本之后都去掉了CC前缀)
4项目目录结构如下:
编写公共的头文件T32.h |
#ifndef@H_450_33@ _T32_H__@H_450_33@ #define@H_450_33@ _T32_H__@H_450_33@ #include@H_450_33@ "cocos2d.h"@H_450_33@ USING_NS_CC@H_450_33@; #define@H_450_33@ winSize@H_450_33@ Director@H_450_33@::geTinstance@H_450_33@()->getWinSize@H_450_33@() //@H_450_33@因为3.2@H_450_33@版本中输出日志不建议使用CCLog,而是使用log,为了还想 //@H_450_33@使用原来风格的CCLog@H_450_33@做如下定义 #define@H_450_33@ CCLog@H_450_33@ cocos2d@H_450_33@::log@H_450_33@ |
编写:TBACk.h |
#ifndef@H_450_33@ __TBACk_H__@H_450_33@ #define@H_450_33@ __TBACk_H__@H_450_33@ #include@H_450_33@ "T32.h"@H_450_33@ //@H_450_33@注意这时候不是CCLayer@H_450_33@了,而是Layer了 class@H_450_33@ TBACk@H_450_33@ :public@H_450_33@ Layer@H_450_33@ public@H_450_33@: CREATE_FUNC@H_450_33@(TBACk@H_450_33@); bool@H_450_33@ init@H_450_33@(); }; #endif@H_450_33@ |
编写TBACk.cpp |
#include@H_450_33@ "TBACk.h"@H_450_33@ bool@H_450_33@ TBACk@H_450_33@::init@H_450_33@() Layer@H_450_33@::init@H_450_33@(); //@H_450_33@设置zorder@H_450_33@ setLocalZOrder@H_450_33@(100); @H_388_86@menu@H_450_33@* menu@H_450_33@ = @H_388_86@menu@H_450_33@::create@H_450_33@(); @H_388_86@menuItemImage@H_450_33@* item@H_450_33@ = @H_388_86@menuItemImage@H_450_33@::create@H_450_33@("CloseNormal.png"@H_450_33@,"CloseSELEcted.png"@H_450_33@, }); @H_781_222@menu@H_450_33@->addChild@H_450_33@(item@H_450_33@); //@H_450_33@注意,这里的没有回调函数了,而是用lambada@H_450_33@表达是来替换掉了。 item@H_450_33@->setPosition@H_450_33@(winSize@H_450_33@.width@H_450_33@ / 2 -item@H_450_33@->getBoundingBox@H_450_33@().size@H_450_33@.width@H_450_33@ / 2, item@H_450_33@->getBoundingBox@H_450_33@().size@H_450_33@.height@H_450_33@ / 2 -winSize@H_450_33@.height@H_450_33@ / 2); addChild@H_450_33@(@H_781_222@menu@H_450_33@); return@H_450_33@ true@H_450_33@; } |
编写:TMenu.h |
#ifndef@H_450_33@ __TMenu_H__@H_450_33@ #define@H_450_33@ __TMenu_H__@H_450_33@ #include@H_450_33@ "T32.h"@H_450_33@ class@H_450_33@ TMenu@H_450_33@ : public@H_450_33@ TMenu@H_450_33@); bool@H_450_33@ init@H_450_33@(); bool@H_450_33@ TouchBegan@H_450_33@(Touch@H_450_33@*, Event@H_450_33@*); }; #endif@H_450_33@ |
编写TMenu.cpp |
#include@H_450_33@ "TMenu.h"@H_450_33@ #include@H_450_33@ "TBACk.h"@H_450_33@ #include@H_450_33@ "T01CPP11.h"@H_450_33@ static@H_450_33@ const@H_450_33@char@H_450_33@* title@H_450_33@[] = { "T01CPP11"@H_450_33@, }; bool@H_450_33@ TMenu@H_450_33@::init@H_450_33@(); addChild@H_450_33@(@H_781_222@menu@H_450_33@); for@H_450_33@ (int@H_450_33@i@H_450_33@ = 0; i@H_450_33@ < sizeof@H_450_33@(title@H_450_33@) / sizeof@H_450_33@(*title@H_450_33@); ++i@H_450_33@) @H_388_86@menuItemFont@H_450_33@* item@H_450_33@ = @H_388_86@menuItemFont@H_450_33@::create@H_450_33@(title@H_450_33@[i@H_450_33@],[](Ref@H_450_33@*sender@H_450_33@){ @H_388_86@menuItem@H_450_33@* item@H_450_33@ = (@H_388_86@menuItem@H_450_33@*)sender@H_450_33@; int@H_450_33@ i@H_450_33@ = item@H_450_33@->getTag@H_450_33@() - 1000; Layer@H_450_33@* l@H_450_33@ = NULL@H_450_33@; if@H_450_33@ (title@H_450_33@[i@H_450_33@] =="T01CPP11"@H_450_33@) l@H_450_33@ = T01CPP11@H_450_33@::create@H_450_33@(); } TBACk@H_450_33@*b@H_450_33@ = TBACk@H_450_33@::create@H_450_33@(); Scene@H_450_33@*s@H_450_33@ = Scene@H_450_33@::create@H_450_33@(); s@H_450_33@->addChild@H_450_33@(b@H_450_33@); s@H_450_33@->addChild@H_450_33@(l@H_450_33@); pushScene@H_450_33@(s@H_450_33@); } }); @H_781_222@menu@H_450_33@->addChild@H_450_33@(item@H_450_33@); item@H_450_33@->setTag@H_450_33@(1000 +i@H_450_33@); } @H_781_222@menu@H_450_33@->alignItemsVertically@H_450_33@(); auto@H_450_33@ ev@H_450_33@ = EventListenerTouchOneByOne@H_450_33@::create@H_450_33@(); #if@H_450_33@ 0 ev@H_450_33@->onTouchBegan@H_450_33@ = [](Event@H_450_33@*){ return@H_450_33@ true@H_450_33@; }; #endif@H_450_33@ //@H_450_33@下面两行代码是相同的@H_450_33@ //ev->onTouchBegan = std::bind(&TMenu::TouchBegan,this,std::placeholders::_1,std::placeholders::_2);@H_450_33@ ev@H_450_33@->onTouchBegan@H_450_33@ =CC_CALLBACK_2@H_450_33@(TMenu@H_450_33@::TouchBegan@H_450_33@,this@H_450_33@); ev@H_450_33@->onTouchMoved@H_450_33@ = [&](Touch@H_450_33@*touch@H_450_33@,133)">Event@H_450_33@*){ setPositionY@H_450_33@(getPositionY@H_450_33@() +touch@H_450_33@->getDelta@H_450_33@().y@H_450_33@); }; _eventDispatcher@H_450_33@->addEventListenerWithSceneGraphpriority@H_450_33@(ev@H_450_33@,this@H_450_33@); return@H_450_33@ true@H_450_33@; } bool@H_450_33@ TouchBegan@H_450_33@(/*TMEnu* this,*/@H_450_33@Event@H_450_33@*) return@H_450_33@ true@H_450_33@; } |
编写:T01CPP11.h |
#ifndef@H_450_33@ __T01CPP11_H__@H_450_33@ #define@H_450_33@ __T01CPP11_H__@H_450_33@ #include@H_450_33@ T01CPP11@H_450_33@:public@H_450_33@ T01CPP11@H_450_33@); bool@H_450_33@ init@H_450_33@(); void@H_450_33@ mFoo@H_450_33@(); }; #endif@H_450_33@ |
编写:T01CPP11.cpp(主要介绍lambada表达式) |
#include@H_450_33@ "T01CPP11.h"@H_450_33@ void@H_450_33@ foo@H_450_33@() CCLog@H_450_33@("foo is called\n"@H_450_33@); } void@H_450_33@ funArg3@H_450_33@(int@H_450_33@ n@H_450_33@,char@H_450_33@c@H_450_33@,float@H_450_33@ f@H_450_33@) "%d,%c,%f"@H_450_33@,n@H_450_33@,c@H_450_33@,f@H_450_33@); } void@H_450_33@ @H_221_250@mFoo@H_450_33@() } //@H_450_33@关于lambda@H_450_33@表达式 bool@H_450_33@ init@H_450_33@(); auto@H_450_33@ func@H_450_33@ = []{return@H_450_33@ 1; }; int@H_450_33@ i@H_450_33@ = func@H_450_33@(); "i = %d"@H_450_33@,i@H_450_33@); } //@H_450_33@最简单的lambada@H_450_33@表达式是只要一个中括号和一个大括号 //1.@H_450_33@捕获列表,可以放变量名,这里可以用来传递函数体内定义的变量@H_450_33@ int@H_450_33@ v@H_450_33@ = 100; auto@H_450_33@ func@H_450_33@ = [v@H_450_33@]{return@H_450_33@v@H_450_33@; }; int@H_450_33@ x@H_450_33@ = func@H_450_33@(); } //2.@H_450_33@捕获列表,可以捕获多个变量@H_450_33@ int@H_450_33@ p@H_450_33@ = 100,q@H_450_33@ = 200; auto@H_450_33@ func@H_450_33@ = [p@H_450_33@,q@H_450_33@]{return@H_450_33@p@H_450_33@ + q@H_450_33@; }; int@H_450_33@ s@H_450_33@ = func@H_450_33@(); } // 3.@H_450_33@捕获列表,有引用和传值两种方式,传值不可以改变,引用可以改变,并且改变外部的变量值@H_450_33@ int@H_450_33@ p@H_450_33@ = 100,&q@H_450_33@]{q@H_450_33@++;return@H_450_33@ p@H_450_33@ + q@H_450_33@; }; int@H_450_33@ s@H_450_33@ = func@H_450_33@(); } //4.@H_450_33@捕获列表,可以定义mutable@H_450_33@类型的lambada,能改变传值的捕获参数, //@H_450_33@但是不能改变外部的变量值@H_450_33@ int@H_450_33@ p@H_450_33@ = 100,q@H_450_33@]()@H_719_32@mutable@H_450_33@{p@H_450_33@++;q@H_450_33@++; return@H_450_33@ p@H_450_33@ + q@H_450_33@; }; int@H_450_33@ s@H_450_33@ = func@H_450_33@(); "p = %d,q = %d,s = %d"@H_450_33@,p@H_450_33@,q@H_450_33@,s@H_450_33@); } //5.@H_450_33@捕获列表,可以用=@H_450_33@或者&捕获所有变量,=指传值,&表示引用 int@H_450_33@ p@H_450_33@ = 100,q@H_450_33@ = 200; //@H_450_33@用&@H_450_33@的时候,所有的都可以调用了,[&,p]:表示除了p不能被使用,其它的都可以被使用 auto@H_450_33@ func@H_450_33@ = [&]{ return@H_450_33@ p@H_450_33@ + q@H_450_33@; }; } //@H_450_33@稍微复杂点的lambda@H_450_33@表达式 auto@H_450_33@ add@H_450_33@ = [](int@H_450_33@ v1@H_450_33@,int@H_450_33@ v2@H_450_33@){return@H_450_33@v1@H_450_33@ + v2@H_450_33@; }; auto@H_450_33@ a@H_450_33@ = add@H_450_33@(1,2); } //@H_450_33@小括号中的是参数列表,参数列表和捕获列表区别在于,参数列表的参数由调用方决定,@H_450_33@ //@H_450_33@捕获列表由定义方决定,所以更加灵活@H_450_33@ //@H_450_33@更加复杂的lambada@H_450_33@表达是,有返回值,返回值一般都省略 //->int@H_450_33@表示返回值是int@H_450_33@类型的 auto@H_450_33@ add@H_450_33@ = [](int@H_450_33@ v1@H_450_33@,int@H_450_33@ v2@H_450_33@)->int@H_450_33@{return@H_450_33@v1@H_450_33@ + v2@H_450_33@; }; } //@H_450_33@总结:auto func = [](){}@H_450_33@ auto@H_450_33@ func@H_450_33@ = [](){}; } return@H_450_33@ true@H_450_33@; } |
// T01CPP11.cpp中使用使用function和bind函数的案例: |
#include@H_450_33@ init@H_450_33@();
//std::function;@H_450_33@ //std::bind@H_450_33@ std@H_450_33@::function@H_450_33@<void@H_450_33@()>func@H_450_33@ = foo@H_450_33@; //@H_450_33@成员函数指针的赋值和调用@H_450_33@ //@H_450_33@注意在::@H_450_33@域作用符后面加上* void@H_450_33@(T01CPP11@H_450_33@::*FuncPtr@H_450_33@)() = &T01CPP11@H_450_33@::@H_818_62@mFoo@H_450_33@; //@H_450_33@调用成员函数的时候加上this@H_450_33@ (this@H_450_33@->*FuncPtr@H_450_33@)(); } //bind@H_450_33@的功能,就是把一个具体函数,编程std::function@H_450_33@对象 //bind@H_450_33@可以把具体函数和std::function@H_450_33@形式完全改变,比如参数数量的改变 function@H_450_33@<void@H_450_33@()>func@H_450_33@ = std@H_450_33@::bind@H_450_33@(funArg3@H_450_33@,100,21)">'c'@H_450_33@,0.1f); } //@H_450_33@也可以改变参数顺序@H_450_33@ //_1@H_450_33@:表示function<void(float,char,int)>@H_450_33@括号中的第一个参数 //_2:@H_450_33@表示function<void(float,int)>@H_450_33@括号中的第二个参数 //_3:@H_450_33@表示function<void(float,int)>@H_450_33@括号中的第三个参数 //@H_450_33@后面3@H_450_33@个占位符分别在funArg3中的顺序,而又用标记来代表上面括号中参数的的位置 function@H_450_33@<void@H_450_33@(float@H_450_33@,char@H_450_33@,int@H_450_33@)> func@H_450_33@ = std@H_450_33@:::rgb(136, placeholders@H_450_33@::_3@H_450_33@,133)">placeholders@H_450_33@::_2@H_450_33@,133)">placeholders@H_450_33@::_1@H_450_33@); func@H_450_33@(1.0f,21)"> 'd'@H_450_33@,2000); } // @H_450_33@也可以同时改变参数个数和顺序@H_450_33@ :rgb(33,char@H_450_33@)> func@H_450_33@ = :rgb(33, 100,133)">placeholders@H_450_33@::_1@H_450_33@); func@H_450_33@(4.0f,21)"> 'x'@H_450_33@); } //@H_450_33@也可以绑定成员函数@H_450_33@ bind@H_450_33@(&@H_221_250@mFoo@H_450_33@,this@H_450_33@); }
//@H_450_33@下面的运行结果是:lambada is called@H_450_33@ function@H_450_33@<void@H_450_33@()> func@H_450_33@ = [](){}; function@H_450_33@<void@H_450_33@(int@H_450_33@)> func1@H_450_33@ = bind@H_450_33@([](int@H_450_33@,int@H_450_33@){ "lambada iscalled"@H_450_33@); },10,133)">placeholders@H_450_33@::_1@H_450_33@); } return@H_450_33@ true@H_450_33@; } |
修改AppDelegate.cpp |
A添加头文件: #include@H_450_33@ "TBACk.h"@H_450_33@ B:修改:applicationDidFinishLaunching@H_450_33@()@H_450_33@截图如下:@H_450_33@ @H_450_33@ |
以上是大佬教程为你收集整理的2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用全部内容,希望文章能够帮你解决2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。