1. 程式人生 > >cocos2dX 事件之觸控事件和觸控事件集合

cocos2dX 事件之觸控事件和觸控事件集合

今天, 我們來學習cocos2dX裡面的觸控事件與觸控事件合集, 現在的手機遊戲互動基本上都是通過觸控互動的, 所以大家明白這節的重要性了吧, 本節篇幅比較大, 所以我就不扯閒話了

先來看看常用函式:

觸控事件:

addTargeteDelegate( 誰使用, 優先順序, 是否攔截觸控訊息);//註冊單點觸控

virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event);//觸控開始

virtual void ccTouchMoved(CCTouch * touch,CCEvent * event);//觸控滑動

virtual void ccTouchEnded(CCTouch * touch,CCEvent * event);//結束觸控

virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//其他事件中斷觸控

觸控事件集合:

virtual void registerWithTouchDispatcher( void);//註冊多點觸控

addStandardDelegate();//新增委託

setTouchEnabled( bool);//開啟多點觸控, 貌似使用了這個之後就不能使用單點

virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); 
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); 


virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); 
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

我們先來實現觸控事件:

在標頭檔案裡面宣告我們要重寫的函式:

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//觸控開始函式
<span style="white-space:pre">	</span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//觸控移動函式
<span style="white-space:pre">	</span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//觸控結束函式

開啟單點觸控, 並且建立三個標籤用來顯示資訊:

注意: 一定要開啟單點觸控, 不然沒有效果

	//開啟單點觸控
	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this, 0, false);

	//建立三個標籤
	CCLabelTTF* begin = CCLabelTTF::create( "begin:-->X:0.0, -->Y:0.0", "Arial", 24);
	CCLabelTTF* move = CCLabelTTF::create( "move:-->X:0.0, -->Y:0.0", "Arial", 24);
	CCLabelTTF* end = CCLabelTTF::create( "end:-->X:0.0, -->Y:0.0", "Arial", 24);
	begin->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 50));
	move->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
	end->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 50));
	addChild( begin, 0, 101);
	addChild( move, 0, 102);
	addChild( end, 0, 103);

我們來重寫這三個函式:


getLocationInView()取得座標系是以左上角為原點的哦

我們來看看效果:


看, 我們擷取到了觸控事件的訊息了吧

好了, 我們再來看看觸控事件集合:

為什麼有了觸控事件之後我們還要使用觸控事件集合呢?現在的手機基本都支援多點觸控, 而CCTouch不能獲取多點觸控的事件, 所以觸控事件集合就應運而生了

我們 還是宣告一下需要重寫的函式:

virtual void registerWithTouchDispatcher();
	virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
	virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
	virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);


在init裡面開啟多點觸控

//開啟多點觸控
	setTouchEnabled( true);


實現重寫的函式:

void HelloWorld::registerWithTouchDispatcher()
{
	//註冊多點觸控
	CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate( this, 0);
}

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator iter = pTouches->begin();
	for ( ; iter != pTouches->end(); ++iter)
	{
		CCTouch* pTouch = (CCTouch*)(*iter);
		switch ( pTouch->getID())
		{
		case 0:{
			CCLabelTTF* ttf1 = CCLabelTTF::create( "1", "Arial", 24);
			ttf1->setPosition( pTouch->getLocation());
			addChild( ttf1, 0, 101);
			   }break;
		case 1:{
			CCLabelTTF* ttf1 = CCLabelTTF::create( "2", "Arial", 24);
			ttf1->setPosition( pTouch->getLocation());
			addChild( ttf1, 0, 102);
			   }break;
		case 2:{
			CCLabelTTF* ttf1 = CCLabelTTF::create( "3", "Arial", 24);
			ttf1->setPosition( pTouch->getLocation());
			addChild( ttf1, 0, 103);
			   }break;
		case 3:{
			CCLabelTTF* ttf1 = CCLabelTTF::create( "4", "Arial", 24);
			ttf1->setPosition( pTouch->getLocation());
			addChild( ttf1, 0, 104);
			   }break;
		case 4:{
			CCLabelTTF* ttf1 = CCLabelTTF::create( "5", "Arial", 24);
			ttf1->setPosition( pTouch->getLocation());
			addChild( ttf1, 0, 105);
			   }break;
		default:
			break;
		}
	}
	
}

void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator iter = pTouches->begin();
	for ( ; iter != pTouches->end(); ++iter)
	{
		CCTouch* pTouch = (CCTouch*)(*iter);
		switch ( pTouch->getID())
		{
		case 0:{
			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 101);
			ttf->setPosition( pTouch->getLocation());
			   }break;
		case 1:{
			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 102);
			ttf->setPosition( pTouch->getLocation());
			   }break;
		case 2:{
			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 103);
			ttf->setPosition( pTouch->getLocation());
			   }break;
		case 3:{
			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 104);
			ttf->setPosition( pTouch->getLocation());
			   }break;
		case 4:{
			CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 105);
			ttf->setPosition( pTouch->getLocation());
			   }break;
		default:
			break;
		}
	}
}

void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator iter = pTouches->begin();
	for ( ; iter != pTouches->end(); ++iter)
	{
		CCTouch* pTouch = (CCTouch*)(*iter);
		switch ( pTouch->getID())
		{
		case 0:{
			removeChildByTag( 101);
			   }break;
		case 1:{
			removeChildByTag( 102);
			   }break;
		case 2:{
			removeChildByTag( 103);
			   }break;
		case 3:{
			removeChildByTag( 104);
			   }break;
		case 4:{
			removeChildByTag( 105);
			   }break;
		default:
			break;
		}
	}
}





看看效果:


額, 電腦上只能顯示一個觸控點, 我剛剛在手上測試了一下, 可以同時操作多個點的, 我等會上傳安裝檔案, 

我們來看看程式碼:

首先, 我們設定多點觸控可用, 並且註冊了它, 這是必須的哦

我們在開始觸控的時候傳了兩個引數, 第一個引數是個容器, 我們將它取出來, 將begin()取出來作為開始標誌, end()取出來作為結束標誌, 遍歷了這個容器, 在遍歷的過程中, 我們取出了每個物件的ID, 我們所有的觸控點都在這個容器裡面, 和陣列下標相同, 也是從0開始的, 所以我們取出當ID等於0的時候, 我們就繪製出第一個標籤, 我們這裡依次取出了5個, 同理, 在移動裡面, 我們根據ID修改了他們的位置, 在結束觸控裡面, 我們根據標記, 移除了相應的物件

好了, 今天的就到這裡, 希望大家還是多多練習, 有什麼疑問就加群:223856254