深入cocos2d-x中的touch事件
深入cocos2d-x中的touch事件
在文章cocos2d-x中處理touch事件中簡單討論過怎樣處理touch事件, 那么今天來深入了解下cocos2d-x中是怎樣分發(fā)touch事件的。
我們最先來看到CCTouchDispatcher這個類, 這個類在cocos2d-x中是管理和分發(fā)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, 相信大家都用過的, 對, 這就添加多點和單點觸摸的方法, 這個類里面定義了兩個數(shù)組來管理這些添加進來的delegate, 然后當touch事件傳到這個類時, 也就是會調用這個類的touchesBegan等這系列方法。而這四個方法都只是調用了下面這個方法:
void touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex); ?而這個方法主要內容就是分發(fā)touch事件, 首先分發(fā)的是單點事件:
//判斷是否有單點的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, 開始分發(fā)不同的事件CCARRAY_FOREACH(m_pTargetedHandlers, pObj){pHandler = (CCTargetedTouchHandler *)(pObj);if (! pHandler){break;}bool bClaimed = false;if (uIndex == CCTOUCHBEGAN) //touchBegan{//這里拿到的就是我們經(jīng)常在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)//分發(fā)事件的類型{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事件就不再繼續(xù)了if (bClaimed && pHandler->isSwallowsTouches()){if (bNeedsMutableSet){pMutableTouches->removeObject(pTouch);}break;}}} }這就是單點的事件了, 所以不論你把類的優(yōu)先級怎么設置, 單點事件都是在多點事件之前處理的。而多點事件基本類似, 這里就不再贅述了。
然后我們再回到添加delegate的方法上, 來看看優(yōu)先級的處理, 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){//查找比自己優(yōu)先級數(shù)字大的并在它的位置插入if (h->getPriority() < pHandler->getPriority()){++u;}if (h->getDelegate() == pHandler->getDelegate()){CCAssert(0, "");return;}}}pArray->insertObject(pHandler, u); }這個方法主要是按照delegate的優(yōu)先級來添加delegate, 所以代碼中就表明了優(yōu)先級數(shù)字越小, 優(yōu)先級就越高, 但是這只是針對同種類型的touch事件。
這個類的其他方法, 比如移除delegate等等就不在這里贅述了, 好了, 這篇就到這里了。
?
注: 本文由嘯寒原著,請支持原著!轉載請附上原文鏈接:?http://www.cnblogs.com/xiaohan-wu/p/3187994.html
轉載于:https://www.cnblogs.com/xiaohan-wu/p/3265081.html
總結
以上是生活随笔為你收集整理的深入cocos2d-x中的touch事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql命令行执行时不输出列名(字段名
- 下一篇: A better way to lear