Cocos2d-x 3.x中新的回调函数归纳
admin
2023-02-12 03:00:09
0

  由于引入了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中代码:
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 来创建

  • CallFuncN 可以由 std::function 来创建

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

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

CallFunc 示例: 

// v2.1 版本

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

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

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 版本 (长版本)

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表达式或者其他函数对象

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 版本

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



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

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

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

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

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

auto item = MenuItemLabel::create(label,

[&](Object *sender) {

// do something. Item "sender" clicked

});

 

 

相关内容

热门资讯

《成都声明》勾勒亚太数智合作新... 《成都声明》勾勒亚太数智合作新蓝图 7月23日,参会代表在2026年亚太经合组织(APEC)数字和...
SK海力士掌门人“50亿美元天... 财联社7月24日电,SK海力士的亿万富豪崔泰源(CheyTae‑won),其个人财富因人工智能热潮大...
斯里兰卡前高官之子,涉嫌抢劫中... 斯里兰卡警方近期披露,当地破获一起抢劫案,涉案人员5人,涉案金额高达2000万卢比(约合人民币40余...
每日科普 | 量子包治百病?什... 市面上量子手环、量子水杯、量子床垫、量子理疗仪等产品满天飞,商家张口就宣称量子能量可以疏通经络、根除...
上海AI产业交答卷:以生态之力... 上海人工智能产业交答卷:真实产线上淬炼硬核能力 聚合产业推进中国算力体系化 以生态之力,加速AI拐点...
“郑州造”光伏清洁机器人即将交... 7月22日,郑州航空港经济综合实验区坤达产业园内,两台C1光伏清洁机器人正在进行交付前的最后测试。作...
腾讯整合Workbuddy与Q... 快科技7月21日消息 ,据媒体报道,腾讯近日发布内部组织调整通知,将 QClaw产品中心全部相关业务...
TVB正式更名,宣布由传统电视... 7月24日,@TVB官方微博发文官宣TVB更名“无线集团”,TVB表示,由传统电视台升级为跨媒体娱乐...
2026WAIC观察丨白辰甲:... 图片来源/新华社 ■中国经济时报记者 张一鸣 王彩娜 在人工智能浪潮下,具身智能的演变之路也在加速。...
澳大利亚工党大会上,中方官员愤... 据澳大利亚广播公司(ABC)7月23日报道,中国外交官因不满台湾地区代表出席澳大利亚工党(ALP)在...