来源:
http://blog.csdn.net/crayondeng/article/details/18767407
二、在cocos2d-x中,还有一个地方是需要大量使用到回调函数的,这就是回调动作:CCCallFunc、CCCallFuncN、CCCallFuncND、CCCallFuncO。
但是这四个回调动作在 3.0 版本中已经都提示 deprecate 了。那么在3.0 版本中已经只剩下 CallFunc 和 CallFuncN.
其中:CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。
1、CallFunc
- static CallFunc * create(const std::function<void()>& func);
CallFunc的官方例子:(我也是照copy的喔)
// in v2.1
CCCallFunc *action1 = CCCallFunc::create( this, callfunc_selector( MyClass::callback_0 ) );
// in v3.0 (short version)
auto action1 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_0,this));
auto action2 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_1,this, additional_parameters));
// in v3.0 (long version)
auto action1 = CallFunc::create( std::bind( &MyClass::callback_0, this));
auto action2 = CallFunc::create( std::bind( &MyClass::callback_1, this, additional_parameters));
// in v3.0 you can also use lambdas or any other "Function" object
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);
} );
2、CallFuncN
[cpp] view plain copy
static CallFuncN * create(const std::function<void(Node*)>& func);
注意到该回调动作带有一个Node*参数
假设回调函数:
void ActionCallFuncN::callback(Node* sender )
例子:
2.0调用:
auto action = Sequence::create( MoveBy::create(2.0f, Point(150,0)), CallFuncN::create( CC_CALLBACK_1(ActionCallFuncN::callback, this)),NULL);
3.0中的lambda调用
auto action = Sequence::create(MoveBy::create(2.0f, Point(150,0)),
CallFuncN::create([&](Node* sender){
//回调动作代码
// sender :谁调用CallFunN 就代表谁
}),NULL);
================================================================
================================================================
受益于C++11的新语法特性 std::bind ; CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现
1、CallFuncND :回调动作中带有一个Node*参数和一个void*参数
实现过程类似于 CallFuncN
假设回调函数是 :
void ActionCallFuncND::doRemoveFromParentAndCleanup(Node* sender, bool cleanup)
那么在回调动作中:
CallFuncN::create( CC_CALLBACK_1(ActionCallFuncND::doRemoveFromParentAndCleanup, this, true))
这样就实现了等价于 CallFuncND 的回调动作。
2、CallFuncO :回调动作中带有一个Object*参数
实现过程类似于 CallFunc
假设回调函数是: void ActionCallFuncO::callback(Node* node, bool cleanup)
那么在回调动作中:
CallFunc::create( CC_CALLBACK_0(ActionCallFuncO::callback, this, _grossini, true)
这样就实现了等价于 CallFuncO 的回调动作。
原文链接: https://www.cnblogs.com/liangtf/p/6245433.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/246961
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!