加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 16:45:43 所属栏目:百科 来源:网络整理
导读:由于引入了C++ 11特性,cocos2d-x 3.x中许多实现方案,相对于以前的cocos2d-x 2.x,都有了很大的改进,当然性能上也得到一定的提升。 本文关注的是回调函数从2.x到3.x的变化。 cocos2d-x 2.x时代的回调函数 2.X时代主要使用 CCCallFunc、CCCallFuncN和CCCal

  由于引入了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时代实例

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=CCSequence::create(
CCRotateBy::create(3,360),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",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",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 版本

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

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

autoaction1=CallFunc::create(CC_CALLBACK_0(MyClass::callback_0,this));

autoaction2=CallFunc::create(CC_CALLBACK_0(MyClass::callback_1,this,additional_parameters));


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

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

autoaction2=CallFunc::create(std::bind(&MyClass::callback_1,51);word-spacing:0px;">// v3.0 中你也可以使用lambda表达式或者其他函数对象

autoaction1=CallFunc::create(

[&](){

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

autolabel=LabelTTF::create("called:lambdacallback",16);

label->setPosition(ccp(s.width/4*1,s.height/2-40));

this->addChild(label);

});

MenuItem 示例:

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

autoitem=MenuItemLabel::create(label,CC_CALLBACK_1(MyClass::callback,this));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读