在文章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事件