日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入cocos2d-x中的touch事件

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入cocos2d-x中的touch事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深入cocos2d-x中的touch事件

在文章cocos2d-x中處理touch事件中簡單討論過怎樣處理touch事件, 那么今天來深入了解下cocos2d-x中是怎樣分發touch事件的。

我們最先來看到CCTouchDispatcher這個類, 這個類在cocos2d-x中是管理和分發touch事件, 這個類繼承于EGLTouchDelegate:

class CC_DLL EGLTouchDelegate { public:virtual void touchesBegan(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesMoved(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesEnded(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesCancelled(CCSet* touches, CCEvent* pEvent) = 0;virtual ~EGLTouchDelegate() {} };

那么這個類是觸摸的開始, 當然這里指的只是cocos2d-x這個庫的外層接口, 而不包括openGL的部分。

在CCTouchDispatcher類中有兩個方法: addStandardDelegate 和 addTargetedDelegate, 相信大家都用過的, 對, 這就添加多點和單點觸摸的方法, 這個類里面定義了兩個數組來管理這些添加進來的delegate, 然后當touch事件傳到這個類時, 也就是會調用這個類的touchesBegan等這系列方法。而這四個方法都只是調用了下面這個方法:

void touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex); ?

而這個方法主要內容就是分發touch事件, 首先分發的是單點事件:

//判斷是否有單點的handler if (uTargetedHandlersCount > 0) {CCTouch *pTouch;CCSetIterator setIter;for (setIter = pTouches->begin(); setIter != pTouches->end(); ++setIter){pTouch = (CCTouch *)(*setIter);CCTargetedTouchHandler *pHandler = NULL;CCObject* pObj = NULL;//遍歷所有單點的handler, 開始分發不同的事件CCARRAY_FOREACH(m_pTargetedHandlers, pObj){pHandler = (CCTargetedTouchHandler *)(pObj);if (! pHandler){break;}bool bClaimed = false;if (uIndex == CCTOUCHBEGAN) //touchBegan{//這里拿到的就是我們經常在ccTouchBegan里面是返回的true or falsebClaimed = pHandler->getDelegate()->ccTouchBegan(pTouch, pEvent);if (bClaimed)//如果為true, 說明這個delegate要處理事情{pHandler->getClaimedTouches()->addObject(pTouch);}} elseif (pHandler->getClaimedTouches()->containsObject(pTouch)){// moved ended canceledbClaimed = true;switch (sHelper.m_type)//分發事件的類型{case CCTOUCHMOVED:pHandler->getDelegate()->ccTouchMoved(pTouch, pEvent);break;case CCTOUCHENDED:pHandler->getDelegate()->ccTouchEnded(pTouch, pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;case CCTOUCHCANCELLED:pHandler->getDelegate()->ccTouchCancelled(pTouch, pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;}}//如果你返回了true并且你的類swallow掉了touch事件, 那么下面的touch事件就不再繼續了if (bClaimed && pHandler->isSwallowsTouches()){if (bNeedsMutableSet){pMutableTouches->removeObject(pTouch);}break;}}} }

這就是單點的事件了, 所以不論你把類的優先級怎么設置, 單點事件都是在多點事件之前處理的。而多點事件基本類似, 這里就不再贅述了。

然后我們再回到添加delegate的方法上, 來看看優先級的處理, addStandardDelegate 和 addTargetedDelegate都會調用下面這個添加方法:

void CCTouchDispatcher::forceAddHandler(CCTouchHandler *pHandler, CCArray *pArray) {unsigned int u = 0;CCObject* pObj = NULL;CCARRAY_FOREACH(pArray, pObj){CCTouchHandler *h = (CCTouchHandler *)pObj;if (h){//查找比自己優先級數字大的并在它的位置插入if (h->getPriority() < pHandler->getPriority()){++u;}if (h->getDelegate() == pHandler->getDelegate()){CCAssert(0, "");return;}}}pArray->insertObject(pHandler, u); }

這個方法主要是按照delegate的優先級來添加delegate, 所以代碼中就表明了優先級數字越小, 優先級就越高, 但是這只是針對同種類型的touch事件。

這個類的其他方法, 比如移除delegate等等就不在這里贅述了, 好了, 這篇就到這里了。

?

注: 本文由嘯寒原著,請支持原著!轉載請附上原文鏈接:?http://www.cnblogs.com/xiaohan-wu/p/3187994.html

轉載于:https://www.cnblogs.com/xiaohan-wu/p/3265081.html

總結

以上是生活随笔為你收集整理的深入cocos2d-x中的touch事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。