您的位置:首页 > 移动开发 > Cocos引擎

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

2017-02-07 00:00 621 查看
由于引入了C++11特性,cocos2d-x3.x中许多实现方案,相对于以前的cocos2d-x2.x,都有了很大的改进,当然性能上也得到一定的提升。

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

cocos2d-x2.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中代码:
classtestCallFunc:publicCCLayer{protected:
CCSprite*sprite1;
CCSprite*sprite2;
CCSprite*sprite3;public:
virtualvoidonEnter();

voidcallback1();
voidcallback2(CCNode*sender);
voidcallback3(CCNode*sender,void*data);
};

testCallFunc.cpp中代码:

voidtestCallFunc::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=
7fe0
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);
}
voidtestCallFunc::callback1(){
CCSizes=CCDirector::sharedDirector()->getWinSize();
CCLabelTTF*label=CCLabelTTF::create("callback1called","MarkerFelt",16);
label->setPosition(ccp(s.width/4*1,s.height/2));

addChild(label);
}
voidtestCallFunc::callback2(CCNode*pSender){
CCSizes=CCDirector::sharedDirector()->getWinSize();
CCLabelTTF*label=CCLabelTTF::create("callback2called","MarkerFelt",16);
label->setPosition(ccp(s.width/4*2,s.height/2));

addChild(label);
}
voidtestCallFunc::callback3(CCNode*pTarget,void*data){
CCSizes=CCDirector::sharedDirector()->getWinSize();
CCLabelTTF*label=CCLabelTTF::create("callback3called","MarkerFelt",16);
label->setPosition(ccp(s.width/4*3,s.height/2));
addChild(label);
}
cocos2d-x3.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
autoaction1=CallFunc::create(CC_CALLBACK_0(MyClass::callback_0,this));

autoaction2=CallFunc::create(CC_CALLBACK_0(MyClass::callback_1,this,additional_parameters));
//v3.0版本(长版本)

1
2
3
autoaction1=CallFunc::create(std::bind(&MyClass::callback_0,this));

autoaction2=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
autoaction1=CallFunc::create(

[&](){

autos=Director::sharedDirector()->getWinSize();

autolabel=LabelTTF::create("called:lambdacallback","MarkerFelt",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
autoitem=MenuItemLabel::create(label,CC_CALLBACK_1(MyClass::callback,this));
//v3.0版本(长版本)

1
autoitem=MenuItemLabel::create(label,std::bind(&MyClass::callback,this,std::placeholders::_1));
//v3.0中你也可以使用lambda表达式或者其他函数对象

1
2
3
4
5
6
7
autoitem=MenuItemLabel::create(label,

[&](Object*sender){

//dosomething.Item"sender"clicked

});
登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~



本文出自“青峰”博客,请务必保留此出处http://zhuxianzhong.blog.51cto.com/157061/1716528
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: