在文章cocos2d-x中處理touch事件中簡單討論過怎樣處理touch事件, 那麼今天來深刻了解下cocos2d-x中是怎樣分發touch事件的。html
咱們最早來看到CCTouchDispatcher這個類, 這個類在cocos2d-x中是管理和分發touch事件, 這個類繼承於EGLTouchDelegate:web
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等這系列方法。而這四個方法都只是調用了下面這個方法:spa
void touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex);
而這個方法主要內容就是分發touch事件, 首先分發的是單點事件:orm
//判斷是否有單點的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 false bClaimed = pHandler->getDelegate()->ccTouchBegan(pTouch, pEvent); if (bClaimed)//若是爲true, 說明這個delegate要處理事情 { pHandler->getClaimedTouches()->addObject(pTouch); } } else if (pHandler->getClaimedTouches()->containsObject(pTouch)) { // moved ended canceled bClaimed = 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; } } } }
這就是單點的事件了, 因此不論你把類的優先級怎麼設置, 單點事件都是在多點事件以前處理的。而多點事件基本相似, 這裏就再也不贅述了。htm
而後咱們再回到添加delegate的方法上, 來看看優先級的處理, addStandardDelegate 和 addTargetedDelegate都會調用下面這個添加方法:blog
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事件