溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2dx[3.2](11)——新回調(diào)函數(shù)std::bind

發(fā)布時間:2020-07-09 03:26:36 來源:網(wǎng)絡 閱讀:7330 作者:shahdza 欄目:開發(fā)技術(shù)

【嘮叨】

    自從3.0引用了C++11標準后,回調(diào)函數(shù)采用的新的函數(shù)適配器:std::function、std::bind

    而曾經(jīng)的回調(diào)函數(shù)menu_selector、callfunc_selector、cccontrol_selector等都已經(jīng)被無情的拋棄了。

    取而代之的則是一系列的CC_CALLBACK_*。


【致謝】

    http://blog.csdn.net/crayondeng/article/details/18767407

    http://blog.csdn.net/star530/article/details/21245565




【std::bind】


0、std::bind

    請參照上面兩篇文章。   


1、CC_CALLBACK_*

    cocos2dx總共使用了4個std::bind的宏定義,其重點就在于使用了std::bind進行函數(shù)適配

    > std::placeholders::_1 :不定參數(shù)。不事先指定,而是在調(diào)用的時候傳入。

    > ##__VA_ARGS__         :可變參數(shù)列表。

//
// 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__)
//


2、變更的回調(diào)函數(shù)

    > 動作函數(shù)  :CallFunc/CallFuncN

                  callfunc_selector / callfuncN_selector / callfuncND_selector

    > 菜單項回調(diào)menu_selector

    > 觸摸事件  onTouchBeganonTouchMovedonTouchEnded


  2.1、動作函數(shù)CallFunc

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

    > CallFunc :使用CC_CALLBACK_0。不帶任何不定參數(shù)。

    > CallFuncN:使用CC_CALLBACK_1。需要默認傳入不定參數(shù) placeholders::_1,其值為:調(diào)用該動作的對象(如sprite->runAction(callfun),那么默認的一個不定參數(shù) _1 為 sprite)。

//
/**
 *	函數(shù)動作
 *		- 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 );
	
	//回調(diào)函數(shù)
	void HelloWorld::callback0() { }                     //CCCallFunc回調(diào)函數(shù)
	void HelloWorld::callback1(CCNode* node) { }         //CCCallFuncN回調(diào)函數(shù)
	void HelloWorld::callback2(CCNode* node,void* a) { } //CCCallFuncND回調(diào)函數(shù),參數(shù)必須為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為執(zhí)行動作的精靈
	CallFunc::create (std::bind(&HelloWorld::callback0, this ) );
	CallFuncN::create(std::bind(&HelloWorld::callback1, this, sprite);
	CallFuncN::create(std::bind(&HelloWorld::callback2, this, sprite, 0.5));
	
	//回調(diào)函數(shù)
	void HelloWorld::callback0() { }
	void HelloWorld::callback1(Node* node) { }
	void HelloWorld::callback2(Node* node, float a) { }	//可自定義參數(shù)類型float
	
//

    

    當然,如果你對于std::bind很熟悉的話,對于CallFunc、CallFuncN回調(diào)函數(shù)的綁定,也可以全部都使用std::bind。

    如下所示:

//
	//callback0
	CallFunc::create(std::bind(&HelloWorld::callback0, this));
	
	//callback1
	CallFunc::create (std::bind(&HelloWorld::callback1, this, sprite));
	CallFuncN::create(std::bind(&HelloWorld::callback1, this, std::placeholders::_1));

	//callback2
	CallFunc::create (std::bind(&HelloWorld::callback2, this, sprite, 0.5));
	CallFuncN::create(std::bind(&HelloWorld::callback2, this, std::placeholders::_1, 0.5));
	

	//回調(diào)函數(shù)
	void HelloWorld::callback0() { }
	void HelloWorld::callback1(Node* node) { }
	void HelloWorld::callback2(Node* node, float a) { }	//可自定義參數(shù)類型float
//


  2.2、菜單項回調(diào)menu_selector

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

//
//2.x版本
	MenuItemImage::create("1.png", "2.png", this, menu_selector(HelloWorld::callback));
	
	
//3.x版本
	//CC_CALLBACK_1
	MenuItemImage::create("1.png", "2.png", CC_CALLBACK_1(HelloWorld::callback1, this));
	//std::bind
	MenuItemImage::create("1.png", "2.png", std::bind(&HelloWorld::callback1, this, std::placeholders::_1));

		
//回調(diào)函數(shù)
	void HelloWorld::callback(Node* sender) { }
//


  2.3、觸控事件回調(diào)

    使用CC_CALLBACK_2。

//
	//創(chuàng)建一個事件監(jiān)聽器類型為 單點觸摸
	auto touchLisner = 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);

	//回調(diào)函數(shù)
	virtual bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event); 
	virtual void HelloWorld::onTouchMoved(Touch *touch, Event *unused_event); 
	virtual void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event);
//


3、未變更的回調(diào)函數(shù)


  3.1、定時器回調(diào)schedule_selector

    依舊使用schedule_selector。

//
	//定時器
	schedule(schedule_selector(HelloWorld::update), 1.0/60.0);

	//回調(diào)函數(shù)
	void HelloWorld::update(float dt) { }
//


  3.2、按鈕事件回調(diào)cccontrol_selector

    依舊使用cccontrol_selector。

//
	//按鈕事件綁定
	button->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::callback), Control::EventType::TOUCH_DOWN);
	
	//回調(diào)函數(shù)
	void HelloWorld::callback(Node* sender, Control::EventType controlEvent) { }
//


4、擴展回調(diào)函數(shù)

    在3.x版本中,事件的回調(diào)函數(shù)可以帶任意個自定義的參數(shù)啦。

    舉個栗子:(以菜單項回調(diào)函數(shù)為例)

        請看回調(diào)函數(shù)callback4。

//
	auto sprite = Sprite::create("CloseNormal.png");
	sprite->setPosition(Vec2(visibleSize / 2) );
	this->addChild(sprite);


	auto itemImage = MenuItemImage::create(
				"CloseNormal.png", 
				"CloseNormal.png", 
				std::bind(&HelloWorld::callback4, this, std::placeholders::_1, sprite, 10, 0.5));
	itemImage->setPosition(Vec2(visibleSize / 4));
	auto pMenu = Menu::create(itemImage, NULL);
	pMenu->setPosition(Vec2::ZERO);
	this->addChild(pMenu);
	
	
	//回調(diào)函數(shù)
	void HelloWorld::callback4(Node* sender, Sprite* bg, int a, float b)
	{
		bg->setScale(a * b);
	}
//





向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI