Cocos2d-x 回调函数

Cocos2d-x 回调函数,第1张

概述cocos2dx[3.2](11)——新回调函数std::bind - 夏天的风 - 51CTO技术博客 【唠叨】     自从3.0引用了C++11标准后,回调函数采用的新的函数适配器:std::function、std::bind。     而曾经的回调函数menu_selector、callfunc_selector、cccontrol_selector等都已经被无情的抛弃了。     取而 cocos2dx[3.2](11)——新回调函数std::bind - 夏天的风 - 51CTO技术博客

【唠叨】

自从3.0引用了C++11标准后,回调函数采用的新的函数适配器:std::functionstd::bind

而曾经的回调函数menu_selector、callfunc_selector、cccontrol_selector等都已经被无情的抛弃了。

取而代之的则是一系列的CC_CALLBACK_*

【致谢】

http://www.jb51.cc/article/p-gjmsybrk-yt.html

http://www.jb51.cc/article/p-zsmxtvvc-bcy.html


【std::bind】

0、std::bind

请参照上面两篇文章。

1、CC_CALLBACK_*

cocos2dx总共使用了4个std::bind的宏定义,其重点就在于使用了std::bind进行函数适配

>std::placeholders::_1:不定参数。不事先指定,而是在调用的时候传入。

>##__VA_ARGS__ :可变参数列表。

////newcallbacksbasedonC++11#defineCC_CALLBACK_0(__selector__,__target__,...)std::bind(&__selector__,##__VA_ARGS__)#defineCC_CALLBACK_1(__selector__,std::placeholders::_1,##__VA_ARGS__)#defineCC_CALLBACK_2(__selector__,std::placeholders::_2,##__VA_ARGS__)#defineCC_CALLBACK_3(__selector__,std::placeholders::_3,##__VA_ARGS__)//

2、变更的回调函数

>动作函数 :CallFunc/CallFuncN

callfunc_selector/callfuncN_selector/callfuncND_selector

>菜单项回调menu_selector

>触摸事件 ontouchBegan/ontouchmoved/ontouchended

2.1、动作函数CallFunc

可以直接使用CC_CALLBACK_0、CC_CALLBACK_1,也可以直接使用std::bind。

>CallFunc:使用CC_CALLBACK_0。不带任何不定参数。

>CallFuncN:使用CC_CALLBACK_1。需要默认传入不定参数placeholders::_1,其值为:调用该动作的对象(如sprite->runAction(callfun),那么默认的一个不定参数 _1 为 sprite)。

///***	函数动作*		-CallFunc*		-CallFuncN*		-CallFuncND与CallFuncO已被遗弃,请使用CallFuncN替代*///2.x版本	CallFunc::create(this,callfunc_selector(HelloWorld::callback0));	CCCallFuncN::create(this,callfuncN_selector(HelloWorld::callback1));	CCCallFuncND::create(this,callfuncND_selector(HelloWorld::callback2),(voID*)10);		//回调函数	voIDHelloWorld::callback0(){}//CCCallFunc回调函数	voIDHelloWorld::callback1(CCNode*node){}//CCCallFuncN回调函数	voIDHelloWorld::callback2(CCNode*node,voID*a){}//CCCallFuncND回调函数,参数必须为voID*//3.x版本	//使用CC_CALLBACK_*	CallFunc::create(CC_CALLBACK_0(HelloWorld::callback0,this));	CallFuncN::create(CC_CALLBACK_1(HelloWorld::callback1,this));	CallFuncN::create(CC_CALLBACK_1(HelloWorld::callback2,this,0.5));		//使用std::bind	//其中sprite为执行动作的精灵	CallFunc::create(std::bind(&HelloWorld::callback0,this));	CallFuncN::create(std::bind(&HelloWorld::callback1,sprite);	CallFuncN::create(std::bind(&HelloWorld::callback2,sprite,0.5));		//回调函数	voIDHelloWorld::callback0(){}	voIDHelloWorld::callback1(Node*node){}	voIDHelloWorld::callback2(Node*node,floata){}	//可自定义参数类型float	//

当然,如果你对于std::bind很熟悉的话,对于CallFunc、CallFuncN回调函数的绑定,也可以全部都使用std::bind。

如下所示:

//	//callback0	CallFunc::create(std::bind(&HelloWorld::callback0,this));		//callback1	CallFunc::create(std::bind(&HelloWorld::callback1,sprite));	CallFuncN::create(std::bind(&HelloWorld::callback1,std::placeholders::_1));	//callback2	CallFunc::create(std::bind(&HelloWorld::callback2,0.5));	CallFuncN::create(std::bind(&HelloWorld::callback2,0.5));		//回调函数	voIDHelloWorld::callback0(){}	voIDHelloWorld::callback1(Node*node){}	voIDHelloWorld::callback2(Node*node,floata){}	//可自定义参数类型float//

2.2、菜单项回调menu_selector

使用CC_CALLBACK_1,也可以直接使用std::bind。

////2.x版本	MenuItemImage::create("1.png","2.png",menu_selector(HelloWorld::callback));		//3.x版本	//CC_CALLBACK_1	MenuItemImage::create("1.png",CC_CALLBACK_1(HelloWorld::callback1,this));	//std::bind	MenuItemImage::create("1.png",std::bind(&HelloWorld::callback1,std::placeholders::_1));		//回调函数	voIDHelloWorld::callback(Node*sender){}//

2.3、触控事件回调

使用CC_CALLBACK_2

//	//创建一个事件监听器类型为单点触摸	autotouchlisner=EventListenertouchOneByOne::create();	//绑定事件	touchlisner->ontouchBegan=CC_CALLBACK_2(HelloWorld::ontouchBegan,this);	touchlisner->ontouchmoved=CC_CALLBACK_2(HelloWorld::ontouchmoved,this);	touchlisner->ontouchended=CC_CALLBACK_2(HelloWorld::ontouchended,this);	//回调函数	virtualboolHelloWorld::ontouchBegan(touch*touch,Event*unused_event);	virtualvoIDHelloWorld::ontouchmoved(touch*touch,Event*unused_event);	virtualvoIDHelloWorld::ontouchended(touch*touch,Event*unused_event);//

3、未变更的回调函数

3.1、定时器回调schedule_selector

依旧使用schedule_selector

//	//定时器	schedule(schedule_selector(HelloWorld::update),1.0/60.0);	//回调函数	voIDHelloWorld::update(floatdt){}//

3.2、按钮事件回调cccontrol_selector

依旧使用cccontrol_selector

//	//按钮事件绑定	button->addTargetWithActionForControlEvents(this,cccontrol_selector(HelloWorld::callback),Control::EventType::touch_DOWN);		//回调函数	voIDHelloWorld::callback(Node*sender,Control::EventTypecontrolEvent){}//

4、扩展回调函数

在3.x版本中,事件的回调函数可以带任意个自定义的参数啦。

举个栗子:(以菜单项回调函数为例)

请看回调函数callback4。

  //	autosprite=Sprite::create("Closenormal.png");	sprite->setposition(Vec2(visibleSize/2));	this->addChild(sprite);	autoitemImage=MenuItemImage::create(				"Closenormal.png","Closenormal.png",std::bind(&HelloWorld::callback4,10,0.5));	itemImage->setposition(Vec2(visibleSize/4));	autopMenu=Menu::create(itemImage,NulL);	pMenu->setposition(Vec2::ZERO);	this->addChild(pMenu);			//回调函数	voIDHelloWorld::callback4(Node*sender,Sprite*bg,inta,floatb)	{		bg->setScale(a*b);	}//

本文出自 “夏天的风” 博客,请务必保留此出处http://www.jb51.cc/article/p-kiicpnup-wx.html

总结

以上是内存溢出为你收集整理的Cocos2d-x 回调函数全部内容,希望文章能够帮你解决Cocos2d-x 回调函数所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1054819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存