Cocos2d-x之CC_CALLBACK详解

本文转载于CC_CALLBACK 与 std::bind之间不可告人的秘密
本篇的主题就是揭露CC_CALLBACK 与 std::bind之间不可告人的秘密……

首先看一段代码:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
//先是创建3个精灵
boy = Sprite::create(“boy.png”);//创建boy
boy->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
this->addChild(boy,1);

girl_1 = Sprite::create(“girl_1.png”);//创建girl1
girl_1->setPosition(Point(visibleSize.width/3,visibleSize.height/2));
girl_1->setTag(10);
this->addChild(girl_1,1);

girl_2 = Sprite::create(“girl_3.png”);//创建girl2
girl_2->setPosition(Point(2*visibleSize.width/3,visibleSize.height/2));
girl_2->setTag(20);
this->addChild(girl_2,1);

//让boy运动,通过Callfunc回调到callback1
boy->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,100)),
CallFunc::create(CC_CALLBACK_0(HelloWorld::callback1,this)),
NULL));
三个回调函数的实现:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
void HelloWorld::callback1()
{
CCLOG(“in callback1”);
//girl1运动,最后回调到callback2
girl_1->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,150)),
CallFunc::create(CC_CALLBACK_0(HelloWorld::callback2,this,girl_1)),
NULL));
}
void HelloWorld::callback2(Node* sender)
{
//girl2运动,最后回调到callback3
girl_2->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,200)),
CallFunc::create(CC_CALLBACK_0(HelloWorld::callback3,this,girl_2,99)),
NULL));

CCLOG("in callback2,sender tag is:%d",(Sprite*)sender->getTag());  

}
void HelloWorld::callback3(Node* sender, long data)
{
//最终输出
CCLOG(“in callback3,everything is OK,sender tag is:%d,date is:%ld”,(Sprite*)sender->getTag(),data);
CCLOG(“girl2 dandan ask:what fake the CC_CALLBACK is?”);
}
整个过程就是boy“勾引”girl1,但girl1显然对异性兴趣不大,于是她也勾引girl2……可是,girl2对同性异性都没兴趣,她只是淡淡的说了句:CC_CALLBACK到底是什么?,调试如图:

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

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
// new callbacks based on C++11

define CC_CALLBACK_0(selector,target, …) std::bind(&selector,target, ##VA_ARGS)

define CC_CALLBACK_1(selector,target, …) std::bind(&selector,target, std::placeholders::_1, ##VA_ARGS)

define CC_CALLBACK_2(selector,target, …) std::bind(&selector,target, std::placeholders::_1, std::placeholders::_2, ##VA_ARGS)

define CC_CALLBACK_3(selector,target, …) std::bind(&selector,target, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ##VA_ARGS)

看完后恍然大悟!不看不知道,一看…和没看一样…
这里主要注意两点:一是 std::bind,二是##VA_ARGS; ##VA_ARGS是可变参数宏,我就不多说了。重点讲的是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,如下,
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
int callback(int one,char two,double three);
下面我们用bind来调用callback
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
auto newCallback = bind(callback,_1,_2,1.5);
int x = newCallback(10,’h’); //这句相当于:int x = 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。代码如下 :

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
//让boy运动,通过Callfunc回调到callback1
boy->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,100)),
CallFunc::create(std::bind(&HelloWorld::callback1,this)),
NULL));
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
void HelloWorld::callback1()
{
CCLOG(“in callback1”);
//girl1运动,最后回调到callback2
girl_1->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,150)),
CallFunc::create(std::bind(&HelloWorld::callback2,this,girl_1)),
NULL));
CCLOG(“boy ask girl_1:can you do my girlFriends?”);
}
void HelloWorld::callback2(Node* sender)
{
//girl2运动,最后回调到callback3
girl_2->runAction(CCSequence::create(MoveBy::create(1.0f,Point(0,200)),
CallFunc::create(std::bind(&HelloWorld::callback3,this,girl_1,99)),
NULL));

CCLOG("in callback2,sender tag is:%d",(Sprite*)sender->getTag());  
CCLOG("girl_1 ask girl_2:I love girl_2");  

}
void HelloWorld::callback3(Node* sender, long data)
{
//最终输出
CCLOG(“in callback3,everything is OK,sender tag is:%d,date is:%ld”,(Sprite*)sender->getTag(),data);
CCLOG(“girl2 dandan say:I know how to use CC_CALLBACK!”);
}

恩,就是这样子了。bind与CC_CALLBAC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值