Cocos2d-x3.5 _ 示例工程分析

前端之家收集整理的这篇文章主要介绍了Cocos2d-x3.5 _ 示例工程分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

controller.cpp

1 std::function<TestScene*()> callback;//一个是返回值,一个是参数。返回值是TestScene*,参数是()里的东西
1 Controller g_aTestNames[] = {
2 
3     //
4      TESTS MUST BE ORDERED ALPHABETICALLY
5          violators will be prosecuted
6     //
7     { "ActionManager",[](){return new ActionManagerTestScene(); } },

这里是lambda的语法。

C++11 的 lambda 表达式规范如下:

  • [ capture ] ( params ) mutable exception attribute -> ret { body }
  • [ capture ] ( params ) -> ret { body }
  • [ capture ] ( params ) { body }
  • [ capture ] { body }

如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:

  • [a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
  • [this] 以值的方式捕获 this 指针。
  • [&] 以引用的方式捕获所有的外部自动变量。
  • [=] 以值的方式捕获所有的外部自动变量。
  • [] 不捕获外部的任何变量。

此外,params 指定 lambda 表达式的参数。

ActionManagerTest.cpp

1 grossini->runAction( Sequence::create( 2 MoveBy::create(1,Vec2(150,0)),3 CallFuncN::create(CC_CALLBACK_1(LogicTest::bugMe,this)),128)">4 nullptr) 5 );
1 auto pCallback = CallFunc::create(CC_CALLBACK_0(StopActionTest::stopAction,255)">this)); 注意这里没有传进参数就是0咯

CC_CALLBACK_N (摘自:http://my.oschina.net/u/555701/blog/219844

1 new callbacks based on C++11 2 #define CC_CALLBACK_0(__selector__,__target__,...) std::bind(&__selector__,##__VA_ARGS__) 3 #define CC_CALLBACK_1(__selector__,std::placeholders::_1,128)">4 #define CC_CALCC_CALLBACK_1(HelloWorld::menuCloseCallback,this)LBACK_2(__selector__,std::placeholders::_2,128)">5 #define CC_CALLBACK_3(__selector__,std::placeholders::_3 ##__VA_ARGS__)
bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指定的参 数,可以使用占位符_1、_2、_3来表示。_1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。

CC_CALLBACK_1不事先指定的有一个,也就是可以传进一个参数。不事先指定的参数就在LogicTest::bugMe的参数列表上。 这个个数和具体的函数个数是一致的。

但是下面这个还是没有理解,得之后再看下引擎的接口应该就知道了。

1 auto action = Sequence::create( 2 Place::create(Vec2(200,128)">200)),128)"> 3 Show::create(),128)"> 4 MoveBy::create(100,128)"> 5 CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,128)"> 6 CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,255)">this,_grossini)),128)"> 7 CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,255)">this,_grossini,128)">0xbebabeba)),128)"> 8 nullptr); 9 10 _grossini->runAction(action);
CC_CALLBACK_0已经不需要了,直接用std::bind就行了。

1 auto action1 = Sequence::create( 2 MoveBy::create(2,128)">3 CallFunc::create( std::bind(&ActionCallFunction::callback1,255)">this) ),

1 l->setPosition(VisibleRect::center().x,VisibleRect::top().y-75);

Cocos2d引擎家族,包括Cocos2d-x,Cocos2d-JS的坐标系统是继承于OpenGL的右手笛卡尔坐标系(Right-handed Cartesian Coordinate System)。

Cocos2d坐标系的特点是:

  • 原点为屏幕左下角
  • 向右为X轴正方向
  • 向上为Y轴正方向
1 auto pMove1 = MoveBy::create(0)); 2 auto pMove2 = MoveBy::create( 3 auto pSequenceMove = Sequence::createWithTwoActions(pMove1,pMove2); 4 auto pRepeatMove = RepeatForever::create(pSequenceMove); 5 pRepeatMove->setTag(kTagSequence); 6 7 auto pScale1 = ScaleBy::create(1.5f); 8 auto pScale2 = ScaleBy::create(1.0f/ 9 auto pSequenceScale = Sequence::createWithTwoActions(pScale1,pScale2); 10 auto pRepeatScale = RepeatForever::create(pSequenceScale); 11 pRepeatScale->setTag(kTagSequence); 用同一个tag

这里将pRepeatMove和pRepeatScale设置成同一个tag,然后stopAllActionsByTag就可以停止这两个运用了。

ActionEaseTest.cpp

1 rotate and jump 2 auto jump1 = JumpBy::create(4,Vec2(-s.width+80,128)">0),128)">4); 3 auto jump2 = jump1->reverse(); 4 auto rot1 = RotateBy::create(360*2); 5 auto rot2 = rot1->reverse(); 7 auto seq3_1 = Sequence::create(jump2,jump1,nullptr); 8 auto seq3_2 = Sequence::create( rot1,rot2,128)"> 9 auto spawn = Spawn::create(seq3_1,seq3_2,128)">10 auto action = Speed::create(RepeatForever::create(spawn),128)">1.0f);

猜你在找的Cocos2d-x相关文章