Cocos2d-x 3.x中新的回调函数归纳

简介:

由于引入了C++ 11特性,cocos2d-x 3.x中许多实现方案,相对于以前的cocos2d-x 2.x,都有了很大的改进,当然性能上也得到一定的提升。

  本文关注的是回调函数从2.x到3.x的变化。

 

cocos2d-x 2.x时代的回调函数

  2.X时代主要使用CCCallFunc、CCCallFuncN和CCCallFuncND等几种方式实现。

  CCCallFunc、CCCallFuncN和CCCallFuncND都用来创建带有回调函数的动作,区别主要在于回调函数是否带有参数。

 

2.x时代实例

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
testCallFunc.h中代码:
class  testCallFunc :  public  CCLayer{ protected :
     CCSprite*    sprite1;
     CCSprite*    sprite2;
     CCSprite*    sprite3; public :
     virtual  void  onEnter();
 
     void  callback1();
     void  callback2(CCNode* sender);
     void  callback3(CCNode* sender,  void * data);
  };
  
  testCallFunc.cpp中代码:
  
  void  testCallFunc::onEnter(){
     //CCCallFunc的使用
     CCFiniteTimeAction*  action = CCSequence::create(
         CCMoveBy::create(2, ccp(200,0)),
         CCCallFunc::create( this , callfunc_selector(testCallFunc::callback1)),
         NULL);
 
     //CCCallFuncN的使用
     CCFiniteTimeAction*  action2 = CCSequence::create(
         CCScaleBy::create(2 ,  2),
         CCFadeOut::create(2),
         CCCallFuncN::create( this , callfuncN_selector(testCallFunc::callback2)),
         NULL);
 
     //CCCallFuncNC的使用
     CCFiniteTimeAction*  action3 = CCSequence::create(
         CCRotateBy::create(3 , 360),
         CCFadeOut::create(2),
         CCCallFuncND::create( this , callfuncND_selector(testCallFunc::callback3), ( void *)0xbebabeba),
         NULL);
 
     sprite1->runAction(action);
     sprite2->runAction(action2);
     sprite3->runAction(action3);
  }
  void  testCallFunc::callback1(){
     CCSize s = CCDirector::sharedDirector()->getWinSize();
     CCLabelTTF *label = CCLabelTTF::create( "callback 1 called" "Marker Felt" , 16);
     label->setPosition(ccp( s.width/4*1,s.height/2));
 
     addChild(label);
  }
  void  testCallFunc::callback2(CCNode* pSender){
     CCSize s = CCDirector::sharedDirector()->getWinSize();
     CCLabelTTF *label = CCLabelTTF::create( "callback 2 called" "Marker Felt" , 16);
     label->setPosition(ccp( s.width/4*2,s.height/2));
 
     addChild(label);
  }
  void  testCallFunc::callback3(CCNode* pTarget,  void * data){
     CCSize s = CCDirector::sharedDirector()->getWinSize();
     CCLabelTTF *label = CCLabelTTF::create( "callback 3 called" "Marker Felt" , 16);
     label->setPosition(ccp( s.width/4*3,s.height/2));
     addChild(label);
  }

cocos2d-x 3.x时代

  由于引用了std::function等支持,回调函数得到极大简化处理。归纳如下:

  • CallFunc 可以由 std::function<void()> 来创建

  • CallFuncN 可以由 std::function<void(Node*)> 来创建

  • CallFuncND 和 CallFuncO 已经被移除了因为它们可以类似地由 CallFuncN 和 CallFunc 来创建。

  可以查看示例中的 ActionsTest.cpp 文件,同时注意MenuItem 支持 std::function<void(Node*)> 作为回调。

CallFunc 示例: 

// v2.1 版本

1
CCCallFunc *action1 = CCCallFunc::create(  this , callfunc_selector( MyClass::callback_0 ) );

// v3.0 版本 (短版本)

1
2
3
auto  action1 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_0, this ));
 
auto  action2 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_1, this , additional_parameters));



// v3.0 版本 (长版本)

1
2
3
auto  action1 = CallFunc::create( std::bind( &MyClass::callback_0,  this ));
 
auto  action2 = CallFunc::create( std::bind( &MyClass::callback_1,  this , additional_parameters));



// v3.0 中你也可以使用lambda表达式或者其他函数对象

1
2
3
4
5
6
7
8
9
10
11
12
13
auto  action1 = CallFunc::create(
 
[&](){
 
auto  s = Director::sharedDirector()->getWinSize();
 
auto  label = LabelTTF::create( "called:lambda callback" "Marker Felt" , 16);
 
label->setPosition(ccp( s.width/4*1,s.height/2-40));
 
this ->addChild(label);
 
} );



MenuItem 示例: 

// v2.1 版本

1
CCMenuItemLabel *item = CCMenuItemLabel::create(label,  this , menu_selector(MyClass::callback));



// v3.0 版本 (短版本)

1
auto  item = MenuItemLabel::create(label, CC_CALLBACK_1(MyClass::callback,  this ));

// v3.0 版本 (长版本)

1
auto  item = MenuItemLabel::create(label, std::bind(&MyClass::callback,  this , std::placeholders::_1));

// v3.0 中你也可以使用lambda表达式或者其他函数对象

1
2
3
4
5
6
7
auto  item = MenuItemLabel::create(label,
 
[&](Object *sender) {
 
// do something. Item "sender" clicked
 
});

 

 















本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/1716528,如需转载请自行联系原作者



相关文章
|
4月前
|
图形学
小功能⭐️Unity改变代码执行顺序
小功能⭐️Unity改变代码执行顺序
|
7月前
|
JavaScript 前端开发 网络架构
JavaScript开发中ES6+新特性:解释箭头函数的作用以及它与普通函数的区别。
JavaScript开发中ES6+新特性:解释箭头函数的作用以及它与普通函数的区别。
73 1
|
7月前
|
前端开发
【前端学习】—箭头函数和普通函数的区别(十四)
【前端学习】—箭头函数和普通函数的区别(十四)
WebApi入门第十一章(定时器作用及语法)
WebApi入门第十一章(定时器作用及语法)
283 0
WebApi入门第十一章(定时器作用及语法)
|
C# 图形学
Unity C# 《有限状态机》的用法教程详解
Unity C# 《有限状态机》的用法教程详解 有限状态机用法教程 本文提供全流程,中文翻译。 助力快速理解 FSM 有限状态机,完成游戏状态的切换 为新手节省宝贵的时间,避免采坑! 有限状态机简称: FSM —— 简称状态机 是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模.
6301 0
|
PHP C#
C#(十四)之函数(方法)
本篇内容记录了函数、函数的参数、参数匹配、递归函数。
153 0
C#(十四)之函数(方法)
|
缓存 Windows
Windows程序设计——WNDCLASS结构参数及其用法
Windows程序设计——WNDCLASS结构参数及其用法
394 0
|
图形学
Unity 事件函数的执行顺序
在 Unity 脚本中,有许多事件函数在脚本执行时按预定的顺序执行。这个执行顺序如下所述: 首个场景加载这些函数在场景开始时调用(对于场景中的每个对象调用一次)。 Awake:在所有 Start 函数之前,以及 prefab 实例化之后调用。
2224 0