Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Cocos2dx 3.0 过渡篇(十七) std::bind与CC_CALLBACK不得不说的故事大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

本篇的主题就是揭露CC_CALLBACK 与 std::bind之间不可告人的秘密......

首先看一段代码:

  1. //先是创建3个精灵
  2. boy=Sprite::create("boy.png");//创建boy
  3. boy->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
  4. this->addChild(boy,1);
  5. girl_1=Sprite::create("girl_1.png");//创建girl1
  6. girl_1->setPosition(Point(visibleSize.width/3,visibleSize.height/2));
  7. girl_1->setTag(10);
  8. this->addChild(girl_1,1);
  9. girl_2=Sprite::create("girl_3.png");//创建girl2
  10. girl_2->setPosition(Point(2*visibleSize.width/3,visibleSize.height/2));
  11. girl_2->setTag(20);
  12. this->addChild(girl_2,1);
  13. //让boy运动,通过Callfunc回调到callBACk1
  14. boy->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,100)),
  15. CallFunc::create(CC_CALLBACK_0(HelloWorld::callBACk1,this)),
  16. NULL));
三个回调函数的实现:
  1. voidHelloWorld::callBACk1()
  2. {
  3. CCLOG("incallBACk1");
  4. //girl1运动,最后回调到callBACk2
  5. girl_1->runAction(CCSequence::create(MoveBy::create(1.0f,150)),
  6. CallFunc::create(CC_CALLBACK_0(HelloWorld::callBACk2,this,girl_1)),
  7. NULL));
  8. }
  9. voidHelloWorld::callBACk2(Node*sender)
  10. {
  11. //girl2运动,最后回调到callBACk3
  12. girl_2->runAction(CCSequence::create(MoveBy::create(1.0f,200)),
  13. CallFunc::create(CC_CALLBACK_0(HelloWorld::callBACk3,girl_2,99)),
  14. NULL));
  15. CCLOG("incallBACk2,sendertagis:%d",(Sprite*)sender->getTag());
  16. }
  17. voidHelloWorld::callBACk3(Node*sender,longdata)
  18. {
  19. //最终输出
  20. CCLOG("incallBACk3,everythingisOK,sendertagis:%d,dateis:%ld",(Sprite*)sender->getTag(),data);
  21. CCLOG("girl2dandanask:whatfaketheCC_CALLBACKis?");
  22. }

整个过程就是boy“勾引”girl1,但girl1显然对异性兴趣不大,于是她也勾引girl2......可是,girl2对同性异性都没兴趣,她只是淡淡的说了句:CC_CALLBACK到底是什么?调试如图:


好吧,先让我回口血,然后再来回答girl2的问题:CC_CALLBACK到底是什么碗糕(东东)?
我们先进CC_CALLBACK源码里看看:

  1. //newcallBACksbasedonC++11
  2. #defineCC_CALLBACK_0(__SELEctor__,__target__,...)std::bind(&__SELEctor__,##__VA_ARGS__)
  3. #defineCC_CALLBACK_1(__SELEctor__,std::placeholders::_1,##__VA_ARGS__)
  4. #defineCC_CALLBACK_2(__SELEctor__,std::placeholders::_2,##__VA_ARGS__)
  5. #defineCC_CALLBACK_3(__SELEctor__,std::placeholders::_3##__VA_ARGS__)
看完后恍然大悟!不看不知道,一看...和没看一样...
这里主要注意两点:一是 std::bind,二是##_VA_ARGS_; ##_VA_ARGS_是可变参数宏
,@R_737_6963@。 重点讲的是std::bind。
std::bind是在C++ 11里新加入的成员。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表.
调用bind的一般形式为:
auto newCallBACk = bind(callBACk,arg_list);
其中,newCallBACk是一个可调用对象,arg_list是可以用逗号分隔的参数列表,至于是啥参数,那就看callBACk函数里有啥参数啦。也就是说,当我们调用newCallBACk时,newCallBACk会调用函数callBACk,并传递参数arg_list给callBACk.

看完上面的内容你的理解可能还比较模糊,那直接来个例子:有一个函数callBACk,如下,
  1. intcallBACk(intone,chartwo,doublethreE);
下面我们用bind来调用callBACk
  1. autonewCallBACk=bind(callBACk,_1,_2,1.5);
  2. intx=newCallBACk(10,'h');//这句相当于:intx=callBACk(10,'h',1.5);
“_1″是一个占位符对象,用于表示当函数callBACk通过函数newCallBACk进行调用时,函数newCallBACk的第一个参数在函数callBACk的参数列表中的位置。第一个参数称为”_1″,第二个参数为”_2″,依此类推,有意思吧。至于‘1.5’是指默认参数,它处于_1和_2的后面,所以它就是double类型的参数了.
在强调一点就是:_1这类占位符都定义在一个名为placeholders的命名空间中,而这个命名空间本身定义在std的命名空间中。为了使用这些名字,两个命名空间都要写上,
如:

std::placeholders::_1;

这样编写贼麻烦,所以在要使用_1时,可以加上这么一句:
using namespace namespace_name; ,ok

,bind就介绍到这,讲的比较浅,不理解的可以百度研究下。最后再回过头来看下CC_CALLBACK的定义,是不是清晰多了?
最后在举个例子吧,还是之前的boy,girl1,girl2,只是他们之间传递“爱意”的方式要换下了。不用CC_CALLBACK,改用std::bind。代码如下 :

  1. //让boy运动,通过Callfunc回调到callBACk1
  2. boy->runAction(CCSequence::create(MoveBy::create(1.0f,
  3. CallFunc::create(std::bind(&HelloWorld::callBACk1,
  4. NULL));
  1. voidHelloWorld::callBACk1()
  2. {
  3. CCLOG("incallBACk1");
  4. //girl1运动,最后回调到callBACk2
  5. girl_1->runAction(CCSequence::create(MoveBy::create(1.0f,
  6. CallFunc::create(std::bind(&HelloWorld::callBACk2,
  7. NULL));
  8. CCLOG("boyaskgirl_1:canyoudomygirlFriends?");
  9. }
  10. voidHelloWorld::callBACk2(Node*sender)
  11. {
  12. //girl2运动,最后回调到callBACk3
  13. girl_2->runAction(CCSequence::create(MoveBy::create(1.0f,
  14. CallFunc::create(std::bind(&HelloWorld::callBACk3,girl_1,
  15. NULL));
  16. CCLOG("incallBACk2,(Sprite*)sender->getTag());
  17. CCLOG("girl_1askgirl_2:Ilovegirl_2");
  18. }
  19. voidHelloWorld::callBACk3(Node*sender,data);
  20. CCLOG("girl2dandansay:IknowhowtouseCC_CALLBACK!");
  21. }
,就是这样子了。bind与CC_CALLBACK之间的关系就是这么的...简单。

大佬总结

以上是大佬教程为你收集整理的Cocos2dx 3.0 过渡篇(十七) std::bind与CC_CALLBACK不得不说的故事全部内容,希望文章能够帮你解决Cocos2dx 3.0 过渡篇(十七) std::bind与CC_CALLBACK不得不说的故事所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。