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