cocos2dx-3.0 : EventDispatcher

前端之家收集整理的这篇文章主要介绍了cocos2dx-3.0 : EventDispatcher前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://blog.csdn.net/u012085988/article/details/16881387

  1. <prename="code"class="cpp"></pre><prename="code"class="cpp"><prename="code"class="cpp">.h
  2. #ifndef__CC_EVENT_DISPATCHER_H__
  3. #define__CC_EVENT_DISPATCHER_H__
  4. #include"CCPlatformMacros.h"
  5. #include"CCEventListener.h"
  6. #include"CCEvent.h"
  7. #include<functional>
  8. #include<string>
  9. #include<unordered_map>
  10. #include<list>
  11. #include<vector>
  12. NS_CC_BEGIN
  13. classEvent;
  14. classEventTouch;
  15. classNode;
  16. /**
  17. 管理eventlistener服务以及事件分发(eventdispatching).
  18. TheEventListenerlistismanagedinsuchawaythat
  19. eventlistenerscanbeaddedandremovedeven
  20. fromwithinanEventListener,whileeventsarebeing
  21. dispatched.
  22. */
  23. classEventDispatcher:publicObject
  24. {
  25. public:
  26. /**注册监听事件(优先级基于Node绘制顺序)
  27. *在消息路由时,先处理优先级<0的,在处理优先级=0(按Node绘制顺序),最后处理优先级>0的
  28. *@paramlistener监听器
  29. *@paramnode监听的node
  30. *@notefixedProprity必须是0
  31. */
  32. @H_403_239@voidaddEventListenerWithSceneGraPHPriority(EventListener*listener,Node*node);
  33. /**注册监听事件(指定优先级)
  34. *@paramlistenerThelistenerofaspecifiedevent.
  35. *@paramfixedPriorityThefixedpriorityofthelistener.
  36. *@noteAlowerprioritywillbecalledbeforetheonesthathaveahighervalue.
  37. *0priorityisforbiddenforfixedprioritysinceit'susedforscenegraphbasedpriority.
  38. voidaddEventListenerWithFixedPriority(EventListener*listener,intfixedPriority);
  39. /**删除某一个监听器
  40. *@paramlistenerThespecifiedeventlistenerwhichneedstoberemoved.
  41. @H_403_239@voidremoveEventListener(EventListener*listener);
  42. /**删除某一类监听器*/
  43. @H_403_239@voidremoveEventListeners(EventListener::TypelistenerType);
  44. /**Removesallcustomlistenerswiththesameeventname*/
  45. voidremoveCustomEventListeners(conststd::string&customEventName);
  46. /**删除所有监听器*/
  47. @H_403_239@voidremoveAllEventListeners();
  48. /**修改某监听器的优先级*/
  49. voidsetPriority(EventListener*listener,87); background-color:inherit; font-weight:bold">intfixedPriority);
  50. /**设置事件分发器是否可用*/
  51. @H_403_239@voidsetEnabled(boolisEnabled);
  52. /**Checkswhetherdispatchingeventsisenabled*/
  53. boolisEnabled()const;
  54. /**分发事件
  55. *同时从dispatcherlist中删除标记为deletion的监听器
  56. voiddispatchEvent(Event*event);
  57. /**ConstructorofEventDispatcher*/
  58. EventDispatcher();
  59. /**DestructorofEventDispatcher*/
  60. ~EventDispatcher();
  61. @H_403_239@private: @H_403_239@friendclassNode;
  62. /**将Node记为Dirty
  63. 即将Node加入_dirtyNodes*/
  64. @H_403_239@voidsetDirtyForNode(Node*node);
  65. /**跟node相关联的所有listener都暂停*/
  66. voidpauseTarget(Node*node);
  67. /**跟node相关联的所有listener都唤醒*/
  68. @H_403_239@voidresuMetarget(Node*node);
  69. /**删除所有跟node相关联的listener*/
  70. voidcleanTarget(Node*node);
  71. *Thevectortostoreeventlistenerswithscenegraphbasedpriorityandfixedpriority.
  72. classEventListenerVector
  73. {
  74. @H_403_239@public:
  75. EventListenerVector();
  76. ~EventListenerVector();
  77. size_tsize() boolempty()const;
  78. voidpush_back(EventListener*item);
  79. voidclearSceneGraphListeners();
  80. @H_403_239@voidclearFixedListeners();
  81. voidclear();
  82. @H_403_239@inlinestd::vector<EventListener*>*getFixedPriorityListeners()const{return_fixedListeners;}; @H_403_239@inlinestd::vector<EventListener*>*getSceneGraPHPriorityListeners()return_sceneGraphListeners;};
  83. inlinelonggetGt0Index()return_gt0Index;};
  84. @H_403_239@inlinevoidsetGt0Index(longindex){_gt0Index=index;};
  85. std::vector<EventListener*>*_fixedListeners;
  86. std::vector<EventListener*>*_sceneGraphListeners;
  87. long_gt0Index;
  88. };
  89. /**Addseventlistenerwithitem*/
  90. @H_403_239@voidaddEventListener(EventListener*listener);
  91. /**Getseventthelistenerlistfortheeventlistenertype.*/
  92. EventListenerVector*getListeners(EventListener::ListenerIDlistenerID);
  93. /**Updatedirtyflag*/
  94. @H_403_239@voidupdateDirtyFlagForSceneGraph();
  95. /**RemovesalllistenerswiththesameeventlistenerID*/
  96. voidremoveEventListenersForListenerID(EventListener::ListenerIDlistenerID);
  97. /**排序*/
  98. @H_403_239@voidsortEventListeners(EventListener::ListenerIDlistenerID);
  99. /**根据node优先级排序*/
  100. voidsortEventListenersOfSceneGraPHPriority(EventListener::ListenerIDlistenerID);
  101. /**根据优先级排序*/
  102. @H_403_239@voidsortEventListenersOfFixedPriority(EventListener::ListenerIDlistenerID);
  103. /**Updatesalllisteners
  104. *1)删除所有标记为deleted的监听器.
  105. *2)添加_toAddedListeners中的监听器.
  106. voidupdateListeners(Event*event);
  107. /**ToucheventneedstobeprocesseddifferentwithothereventssinceitneedssupportALL_AT_ONCEandONE_BY_NONEmode.*/
  108. voiddispatchTouchEvent(EventTouch*event);
  109. /**Associatesnodewitheventlistener*/
  110. @H_403_239@voidassociateNodeAndEventListener(Node*node,EventListener*listener);
  111. /**Dissociatesnodewitheventlistener*/
  112. voiddissociateNodeAndEventListener(Node*node,EventListener*listener);
  113. /**Dispatcheseventtolistenerswithaspecifiedlistenertype*/
  114. @H_403_239@voiddispatchEventToListeners(EventListenerVector*listeners,std::function<bool(EventListener*)>onEvent);
  115. ///Prioritydirtyflag
  116. enumclassDirtyFlag
  117. NONE=0,
  118. FIXED_PRITORY=1<<0,
  119. SCENE_GRAPH_PRIORITY=1<<1,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ALL=FIXED_PRITORY|SCENE_GRAPH_PRIORITY
  120. /**SetsthedirtyflagforaspecifiedlistenerID*/
  121. @H_403_239@voidsetDirty(EventListener::ListenerIDlistenerID,DirtyFlagflag);
  122. /**遍历场景,获取每个Node的绘制顺序;
  123. 函数在sortEventListenersOfSceneGraPHPriority之前调用*/
  124. @H_403_239@voidvisitTarget(Node*node);
  125. private:
  126. /**map存储所有监听器map::key监听器类型*/
  127. std::unordered_map<EventListener::ListenerID,EventListenerVector*>_listeners;
  128. /**map存储一类监听器是否被污染。
  129. 即:按优先级分类,可以把所有监听器分为两类(Node,fixdpriority)。
  130. 如果_listenner[type]里的监听器全是Nodepriority,则DirtyFlag为SCENE_GRAPH_PRIORITY;
  131. 若全为fixdpriority则为FIXED_PRITORY;若两种都有,则为ALL=FIXED_PRITORY|SCENE_GRAPH_PRIORITY*/
  132. /**map关联Node与监听器*/
  133. std::unordered_map<Node*,std::vector<EventListener*>*>_nodeListenersMap;
  134. /**存储每个Node的优先级(即绘制顺序);
  135. 在visitTarge中更新该值,
  136. 在sortEventListenersOfSceneGraPHPriority中使用该值*/
  137. std::unordered_map<Node*,int>_nodePriorityMap;
  138. /**如果注册监听器时正在dispathchevent,则将该监听器加到_toAddedListeners中,
  139. 等dispatch完成后,在将其从_toAddedListeners中移到其他容器,*/
  140. std::vector<EventListener*>_toAddedListeners;
  141. /**优先级发生改变的Node
  142. 此集合中的Node所对应的Listener所在的那个vector(_listeners[ID])将会重排序*/
  143. std::set<Node*>_dirtyNodes;
  144. /**判断是否正在dispatch*/
  145. int_inDispatch;
  146. /**Whethertoenabledispatchingevent*/
  147. bool_isEnabled;
  148. int_nodePriorityIndex;
  149. NS_CC_END
  150. #endif//__CC_EVENT_DISPATCHER_H__
  151. cpp
  152. #include"CCEventDispatcher.h"
  153. #include"CCEventTouch.h"
  154. #include"CCEventCustom.h"
  155. #include"CCEventListenerTouch.h"
  156. #include"CCNode.h"
  157. #include"CCDirector.h"
  158. #include<algorithm>
  159. #defineDUMP_LISTENER_ITEM_PRIORITY_INFO0
  160. @H_403_239@namespace
  161. /************************************************************************/
  162. /*用于自动处理count。一般用于构造一个局部变量。与指针计数器原理相同。
  163. 构造时+1,
  164. 析构时-1.
  165. 函数中有多处return,而每次renturn前都要处理某变量的值,则可以采用此机制优化代码
  166. 此机制只需利用变量a构造一个局部变量,无需在每次返回前再处理变量a。
  167. @H_403_239@classDispatchGuard
  168. DispatchGuard(int&count):
  169. _count(count)
  170. ++_count;
  171. }
  172. ~DispatchGuard()
  173. --_count;
  174. }
  175. int&_count;
  176. //根据Event的type确定EventListener的Type
  177. //关于EventListener的ListenerId与EventListener的Type(注意这里不是Event::Type)映射关系
  178. //出自定制类型外,其他类型都是用枚举一一映射的,而自定制类型则是计算hash值
  179. @H_403_239@staticEventListener::ListenerIDgetListenerID(Event*event)
  180. EventListener::ListenerIDret;
  181. switch(event->getType())
  182. @H_403_239@caseEvent::Type::ACCELERATION:
  183. ret=static_cast<EventListener::ListenerID>(EventListener::Type::ACCELERATION);
  184. break;
  185. @H_403_239@caseEvent::Type::CUSTOM:
  186. autocustomEvent=static_cast<EventCustom*>(event);
  187. autolistenerID=std::hash<std::string>()(customEvent->getEventName());
  188. @H_403_239@static_cast<EventListener::ListenerID>(listenerID);
  189. break;
  190. caseEvent::Type::KEYBOARD:
  191. @H_403_239@static_cast<EventListener::ListenerID>(EventListener::Type::KEYBOARD);
  192. caseEvent::Type::MOUSE:
  193. ret=static_cast<EventListener::ListenerID>(EventListener::Type::MOUSE);
  194. @H_403_239@caseEvent::Type::TOUCH:
  195. //Touchlistenerisveryspecial,itcontainstwokindsoflisteners,EventListenerTouchOneByOneandEventListenerTouchAllAtOnce.
  196. //returnUNKNOWinstead.
  197. @H_403_239@static_cast<EventListener::ListenerID>(EventListener::Type::UNKNOWN);
  198. default:
  199. CCASSERT(false,"Invalidtype!");
  200. @H_403_239@returnret;
  201. EventDispatcher::EventListenerVector::EventListenerVector()
  202. :_sceneGraphListeners(nullptr)
  203. ,_fixedListeners(nullptr)
  204. ,_gt0Index(0)
  205. EventDispatcher::EventListenerVector::~EventListenerVector()
  206. CC_SAFE_DELETE(_sceneGraphListeners);
  207. CC_SAFE_DELETE(_fixedListeners);
  208. size_tEventDispatcher::EventListenerVector::size()const
  209. size_tret=0;
  210. @H_403_239@if(_sceneGraphListeners)
  211. ret+=_sceneGraphListeners->size();
  212. @H_403_239@if(_fixedListeners)
  213. ret+=_fixedListeners->size();
  214. boolEventDispatcher::EventListenerVector::empty()const
  215. return(_sceneGraphListeners==nullptr||_sceneGraphListeners->empty())
  216. &&(_fixedListeners==nullptr||_fixedListeners->empty());
  217. @H_403_239@voidEventDispatcher::EventListenerVector::push_back(EventListener*listener)
  218. if(listener->getFixedPriority()==0)
  219. if(_sceneGraphListeners==nullptr)
  220. _sceneGraphListeners=newstd::vector<EventListener*>();
  221. _sceneGraphListeners->reserve(100);
  222. _sceneGraphListeners->push_back(listener);
  223. else
  224. if(_fixedListeners==nullptr)
  225. _fixedListeners= _fixedListeners->reserve(100);
  226. _fixedListeners->push_back(listener);
  227. voidEventDispatcher::EventListenerVector::clearSceneGraphListeners()
  228. _sceneGraphListeners->clear();
  229. delete_sceneGraphListeners;
  230. _sceneGraphListeners=nullptr;
  231. voidEventDispatcher::EventListenerVector::clearFixedListeners()
  232. _fixedListeners->clear();
  233. delete_fixedListeners;
  234. _fixedListeners=nullptr;
  235. voidEventDispatcher::EventListenerVector::clear()
  236. clearSceneGraphListeners();
  237. clearFixedListeners();
  238. EventDispatcher::EventDispatcher()
  239. :_inDispatch(0)
  240. true)
  241. _toAddedListeners.reserve(50);
  242. EventDispatcher::~EventDispatcher()
  243. removeAllEventListeners();
  244. @H_403_239@voidEventDispatcher::visitTarget(Node*node)
  245. inti=0;
  246. Array*children=node->getChildren();
  247. intchildrenCount=children?children->count():0;
  248. if(childrenCount>0)
  249. Node*child=nullptr;
  250. //只计算子节点中zOrder<0的
  251. for(;i<childrenCount;i++)
  252. child=static_cast<Node*>(children->getObjectAtIndex(i));
  253. @H_403_239@if(child&&child->getZOrder()<0)
  254. visitTarget(child);
  255. else
  256. //记录Node的优先级
  257. _nodePriorityMap.insert(std::make_pair(node,++_nodePriorityIndex));
  258. for(;i<childrenCount;i++)
  259. child=static_cast<Node*>(children->getObjectAtIndex(i));
  260. if(child)
  261. _nodePriorityMap.insert(std::make_pair(node,++_nodePriorityIndex));
  262. @H_403_239@voidEventDispatcher::pauseTarget(Node*node)
  263. autolistenerIter=_nodeListenersMap.find(node);
  264. @H_403_239@if(listenerIter!=_nodeListenersMap.end())
  265. autolisteners=listenerIter->second;
  266. for(auto&l:*listeners)
  267. l->setPaused(true);
  268. @H_403_239@voidEventDispatcher::resuMetarget(Node*node)
  269. autolistenerIter=_nodeListenersMap.find(node);
  270. if(listenerIter!=_nodeListenersMap.end())
  271. autolisteners=listenerIter->second;
  272. @H_403_239@for(auto&l:*listeners)
  273. l->setPaused(false);
  274. setDirtyForNode(node);
  275. @H_403_239@voidEventDispatcher::cleanTarget(Node*node)
  276. autolistenersCopy=*listeners;
  277. for(auto&l:listenersCopy)
  278. removeEventListener(l);
  279. @H_403_239@voidEventDispatcher::associateNodeAndEventListener(Node*node,EventListener*listener)
  280. std::vector<EventListener*>*listeners=nullptr;
  281. autofound=_nodeListenersMap.find(node);
  282. @H_403_239@if(found!=_nodeListenersMap.end())
  283. listeners=found->second;
  284. listeners= listeners->push_back(listener);
  285. _nodeListenersMap.insert(std::make_pair(node,listeners));
  286. @H_403_239@voidEventDispatcher::dissociateNodeAndEventListener(Node*node,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> autoiter=std::find(listeners->begin(),listeners->end(),listener); @H_403_239@if(iter!=listeners->end())
  287. listeners->erase(iter);
  288. if(listeners->empty())
  289. _nodeListenersMap.erase(found);
  290. @H_403_239@deletelisteners;
  291. voidEventDispatcher::addEventListener(EventListener*listener)
  292. //如果不是正在路由事件
  293. @H_403_239@if(_inDispatch==0)
  294. EventListenerVector*listenerList=nullptr;
  295. //根据listenerID获取相应vector
  296. autoiter=_listeners.find(listener->getListenerID());
  297. if(iter==_listeners.end())
  298. listenerList=newEventListenerVector();
  299. _listeners.insert(std::make_pair(listener->getListenerID(),listenerList));
  300. listenerList=iter->second;
  301. listenerList->push_back(listener);
  302. @H_403_239@if(listener->getFixedPriority()==0)
  303. //如果优先级根据Node而定
  304. setDirty(listener->getListenerID(),DirtyFlag::SCENE_GRAPH_PRIORITY);
  305. //如果优先级根据Fixed而定
  306. setDirty(listener->getListenerID(),DirtyFlag::FIXED_PRITORY);
  307. //如果正在路由事件,则直接加入_toAddedListeners
  308. _toAddedListeners.push_back(listener);
  309. @H_403_239@voidEventDispatcher::addEventListenerWithSceneGraPHPriority(EventListener*listener,Node*node)
  310. CCASSERT(listener&&node,"Invalidparameters.");
  311. CCASSERT(!listener->isRegistered(),"Thelistenerhasbeenregistered.");
  312. if(!listener->checkAvailable())
  313. return;
  314. listener->setSceneGraPHPriority(node);
  315. listener->setFixedPriority(0);
  316. listener->setRegistered( listener->retain();
  317. //存储listener,
  318. addEventListener(listener);
  319. //关联node与listener
  320. associateNodeAndEventListener(node,listener);
  321. if(node->isRunning())
  322. resuMetarget(node);
  323. voidEventDispatcher::addEventListenerWithFixedPriority(EventListener*listener,87); background-color:inherit; font-weight:bold">intfixedPriority)
  324. CCASSERT(listener,"Invalidparameters.");
  325. CCASSERT(!listener->isRegistered(),"Thelistenerhasbeenregistered.");
  326. CCASSERT(fixedPriority!=0,"0priorityisforbiddenforfixedprioritysinceit'susedforscenegraphbasedpriority.");
  327. listener->setSceneGraPHPriority(nullptr);
  328. listener->setFixedPriority(fixedPriority);
  329. listener->setPaused( listener->retain();
  330. addEventListener(listener);
  331. voidEventDispatcher::removeEventListener(EventListener*listener)
  332. @H_403_239@if(listener==nullptr) @H_403_239@return;
  333. boolisFound=false;
  334. autoremoveListenerInVector=[&](std::vector<EventListener*>*listeners){
  335. if(listeners==nullptr)
  336. @H_403_239@for(autoiter=listeners->begin();iter!=listeners->end();++iter)
  337. autol=*iter;
  338. if(l==listener)
  339. CC_SAFE_RETAIN(l);
  340. l->setRegistered(if(l->getSceneGraPHPriority()!=nullptr)
  341. //撤销node与listener的关联
  342. dissociateNodeAndEventListener(l->getSceneGraPHPriority(),l);
  343. if(_inDispatch==0)
  344. listeners->erase(iter);
  345. CC_SAFE_RELEASE(l);
  346. isFound=true;
  347. @H_403_239@for(autoiter=_listeners.begin();iter!=_listeners.end();)
  348. autolisteners=iter->second;
  349. autofixedPriorityListeners=listeners->getFixedPriorityListeners();
  350. autosceneGraPHPriorityListeners=listeners->getSceneGraPHPriorityListeners();
  351. removeListenerInVector(sceneGraPHPriorityListeners);
  352. @H_403_239@if(!isFound)
  353. removeListenerInVector(fixedPriorityListeners);
  354. if(iter->second->empty())
  355. _priorityDirtyFlagMap.erase(listener->getListenerID());
  356. autolist=iter->second;
  357. iter=_listeners.erase(iter);
  358. CC_SAFE_DELETE(list);
  359. ++iter;
  360. if(isFound)
  361. CC_SAFE_RELEASE(listener);
  362. //若没有找到,则在_toAddedListeners中找
  363. @H_403_239@for(autoiter=_toAddedListeners.begin();iter!=_toAddedListeners.end();++iter)
  364. if(*iter==listener)
  365. _toAddedListeners.erase(iter);
  366. voidEventDispatcher::setPriority(EventListener*listener,87); background-color:inherit; font-weight:bold">intfixedPriority)
  367. @H_403_239@for(autoiter=_listeners.begin();iter!=_listeners.end();++iter)
  368. autofixedPriorityListeners=iter->second->getFixedPriorityListeners();
  369. if(fixedPriorityListeners)
  370. autofound=std::find(fixedPriorityListeners->begin(),fixedPriorityListeners->end(),153); background-color:inherit; font-weight:bold">if(found!=fixedPriorityListeners->end())
  371. CCASSERT(listener->getSceneGraPHPriority()==nullptr,"Can'tsetfixedprioritywithscenegraphbasedlistener.");
  372. if(listener->getFixedPriority()!=fixedPriority)
  373. voidEventDispatcher::dispatchEventToListeners(EventListenerVector*listeners,87); background-color:inherit; font-weight:bold">bool(EventListener*)>onEvent)
  374. boolshouldStopPropagation=false;
  375. longi=0;
  376. //priority<0
  377. for(;!fixedPriorityListeners->empty()&&i<listeners->getGt0Index();++i)
  378. autol=fixedPriorityListeners->at(i);
  379. @H_403_239@if(!l->isPaused()&&l->isRegistered()&&onEvent(l))
  380. shouldStopPropagation=true;
  381. if(sceneGraPHPriorityListeners)
  382. if(!shouldStopPropagation)
  383. //priority==0,scenegraPHPriority
  384. for(auto&l:*sceneGraPHPriorityListeners)
  385. @H_403_239@if(!l->isPaused()&&l->isRegistered()&&onEvent(l))
  386. shouldStopPropagation=if(fixedPriorityListeners)
  387. //priority>0
  388. for(;i<static_cast<long>(fixedPriorityListeners->size());++i)
  389. @H_403_239@if(!l->isPaused()&&l->isRegistered()&&onEvent(fixedPriorityListeners->at(i))) @H_403_239@voidEventDispatcher::dispatchEvent(Event*event) @H_403_239@if(!_isEnabled)
  390. updateDirtyFlagForSceneGraph();
  391. DispatchGuardguard(_inDispatch);
  392. @H_403_239@if(event->getType()==Event::Type::TOUCH)
  393. dispatchTouchEvent(static_cast<EventTouch*>(event));
  394. autolistenerID=getListenerID(event);
  395. sortEventListeners(listenerID);
  396. autoiter=_listeners.find(listenerID);
  397. @H_403_239@if(iter!=_listeners.end())
  398. autolisteners=iter->second;
  399. autoonEvent=[&event](EventListener*listener)->bool{
  400. event->setCurrentTarget(listener->getSceneGraPHPriority());
  401. listener->_onEvent(event);
  402. returnevent->isStopped();
  403. };
  404. dispatchEventToListeners(listeners,onEvent);
  405. updateListeners(event);
  406. @H_403_239@voidEventDispatcher::dispatchTouchEvent(EventTouch*event)
  407. autotouchOneByOneID=static_cast<EventListener::ListenerID>(EventListener::Type::TOUCH_ONE_BY_ONE);
  408. autotouchAllAtOnceID=static_cast<EventListener::ListenerID>(EventListener::Type::TOUCH_ALL_AT_ONCE);
  409. sortEventListeners(touchOneByOneID);
  410. sortEventListeners(touchAllAtOnceID);
  411. autooneByOnelisteners=getListeners(touchOneByOneID);
  412. autoallAtOncelisteners=getListeners(touchAllAtOnceID);
  413. //Iftherearen'tanytouchlisteners,returndirectly.
  414. @H_403_239@if(nullptr==oneByOnelisteners&&nullptr==allAtOncelisteners)
  415. boolisNeedsMutableSet=(oneByOnelisteners&&allAtOncelisteners);
  416. std::vector<Touch*>orignalTouches=event->getTouches();
  417. std::vector<Touch*>mutableTouches(orignalTouches.size());
  418. std::copy(orignalTouches.begin(),orignalTouches.end(),mutableTouches.begin());
  419. //
  420. //processthetargethandlers1st
  421. if(oneByOnelisteners)
  422. automutableTouchesIter=mutableTouches.begin();
  423. autotouchesIter=orignalTouches.begin();
  424. @H_403_239@for(;touchesIter!=orignalTouches.end();++touchesIter)
  425. boolisSwallowed= autoonTouchEvent=[&](EventListener*l)->bool{//Returntruetobreak
  426. EventListenerTouchOneByOne*listener=static_cast<EventListenerTouchOneByOne*>(l);
  427. //Skipifthelistenerwasremoved.
  428. if(!listener->_isRegistered)
  429. @H_403_239@return event->setCurrentTarget(listener->_node);
  430. boolisClaimed= std::vector<Touch*>::iteratorremovedIter;
  431. EventTouch::EventCodeeventCode=event->getEventCode();
  432. @H_403_239@if
    (eventCode==EventTouch::EventCode::BEGAN) @H_403_239@if(listener->onTouchBegan)
  433. isClaimed=listener->onTouchBegan(*touchesIter,event);
  434. @H_403_239@if(isClaimed&&listener->_isRegistered)
  435. listener->_claimedTouches.push_back(*touchesIter);
  436. elseif(listener->_claimedTouches.size()>0
  437. &&((removedIter=std::find(listener->_claimedTouches.begin(),listener->_claimedTouches.end(),*touchesIter))!=listener->_claimedTouches.end()))
  438. isClaimed=switch(eventCode)
  439. @H_403_239@caseEventTouch::EventCode::MOVED: @H_403_239@if(listener->onTouchMoved)
  440. listener->onTouchMoved(*touchesIter,event);
  441. caseEventTouch::EventCode::ENDED:
  442. @H_403_239@if(listener->onTouchEnded)
  443. listener->onTouchEnded(*touchesIter,153); background-color:inherit; font-weight:bold">if(listener->_isRegistered)
  444. listener->_claimedTouches.erase(removedIter);
  445. caseEventTouch::EventCode::CANCELLED:
  446. @H_403_239@if(listener->onTouchCancelled)
  447. listener->onTouchCancelled(*touchesIter,153); background-color:inherit; font-weight:bold">default:
  448. CCASSERT("Theeventcodeisinvalid.");
  449. //Iftheeventwasstopped,153); background-color:inherit; font-weight:bold">if(event->isStopped())
  450. updateListeners(event);
  451. CCASSERT((*touchesIter)->getID()==(*mutableTouchesIter)->getID(),"");
  452. if(isClaimed&&listener->_isRegistered&&listener->_needSwallow)
  453. if(isNeedsMutableSet)
  454. mutableTouchesIter=mutableTouches.erase(mutableTouchesIter);
  455. isSwallowed= dispatchEventToListeners(oneByOnelisteners,onTouchEvent);
  456. if(event->isStopped())
  457. @H_403_239@if(!isSwallowed)
  458. ++mutableTouchesIter;
  459. //processstandardhandlers2nd
  460. if(allAtOncelisteners&&mutableTouches.size()>0)
  461. autoonTouchesEvent=[&](EventListener*l)->bool{
  462. EventListenerTouchAllAtOnce*listener=static_cast<EventListenerTouchAllAtOnce*>(l);
  463. //Skipifthelistenerwasremoved.
  464. @H_403_239@if(!listener->_isRegistered)
  465. event->setCurrentTarget(listener->_node);
  466. @H_403_239@switch(event->getEventCode()) @H_403_239@caseEventTouch::EventCode::BEGAN: @H_403_239@if(listener->onTouchesBegan)
  467. listener->onTouchesBegan(mutableTouches,153); background-color:inherit; font-weight:bold">if(listener->onTouchesMoved)
  468. listener->onTouchesMoved(mutableTouches,153); background-color:inherit; font-weight:bold">if(listener->onTouchesEnded)
  469. listener->onTouchesEnded(mutableTouches,153); background-color:inherit; font-weight:bold">if(listener->onTouchesCancelled)
  470. listener->onTouchesCancelled(mutableTouches,returndirectly.
  471. dispatchEventToListeners(allAtOncelisteners,onTouchesEvent);
  472. voidEventDispatcher::updateListeners(Event*event)
  473. autoonUpdateListeners=[this](EventListener::ListenerIDlistenerID)
  474. autolistenersIter=_listeners.find(listenerID);
  475. if(listenersIter==_listeners.end())
  476. autolisteners=listenersIter->second;
  477. autofixedPriorityListeners=listeners->getFixedPriorityListeners();
  478. autosceneGraPHPriorityListeners=listeners->getSceneGraPHPriorityListeners();
  479. for(autoiter=sceneGraPHPriorityListeners->begin();iter!=sceneGraPHPriorityListeners->end();)
  480. if(!l->isRegistered())
  481. iter=sceneGraPHPriorityListeners->erase(iter);
  482. l->release();
  483. for(autoiter=fixedPriorityListeners->begin();iter!=fixedPriorityListeners->end();)
  484. autol=*iter;
  485. @H_403_239@if(!l->isRegistered())
  486. iter=fixedPriorityListeners->erase(iter);
  487. l->release();
  488. ++iter;
  489. @H_403_239@if(sceneGraPHPriorityListeners&&sceneGraPHPriorityListeners->empty())
  490. listeners->clearSceneGraphListeners();
  491. if(fixedPriorityListeners&&fixedPriorityListeners->empty())
  492. listeners->clearFixedListeners();
  493. @H_403_239@if(listenersIter->second->empty())
  494. _priorityDirtyFlagMap.erase(listenersIter->first);
  495. deletelistenersIter->second;
  496. listenersIter=_listeners.erase(listenersIter);
  497. ++listenersIter;
  498. if(event->getType()==Event::Type::TOUCH)
  499. onUpdateListeners(static_cast<EventListener::ListenerID>(EventListener::Type::TOUCH_ONE_BY_ONE));
  500. onUpdateListeners(static_cast<EventListener::ListenerID>(EventListener::Type::TOUCH_ALL_AT_ONCE));
  501. onUpdateListeners(getListenerID(event));
  502. @H_403_239@if(!_toAddedListeners.empty())
  503. EventListenerVector*listeners=nullptr;
  504. @H_403_239@for(auto&listener:_toAddedListeners)
  505. EventListener::ListenerIDlistenerID=listener->getListenerID();
  506. autoitr=_listeners.find(listenerID);
  507. if(itr==_listeners.end())
  508. @H_403_239@newEventListenerVector();
  509. _listeners.insert(std::make_pair(listenerID,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> listeners=itr->second;
  510. listeners->push_back(listener);
  511. setDirty(listenerID,DirtyFlag::FIXED_PRITORY);
  512. _toAddedListeners.clear();
  513. @H_403_239@voidEventDispatcher::updateDirtyFlagForSceneGraph() @H_403_239@if(!_dirtyNodes.empty()) @H_403_239@for(auto&node:_dirtyNodes)
  514. autoiter=_nodeListenersMap.find(node);
  515. @H_403_239@if(iter!=_nodeListenersMap.end())
  516. for(auto&l:*iter->second)
  517. setDirty(l->getListenerID(),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _dirtyNodes.clear();
  518. @H_403_239@voidEventDispatcher::sortEventListeners(EventListener::ListenerIDlistenerID)
  519. DirtyFlagdirtyFlag=DirtyFlag::NONE;
  520. autodirtyIter=_priorityDirtyFlagMap.find(listenerID);
  521. @H_403_239@if(dirtyIter!=_priorityDirtyFlagMap.end())
  522. dirtyFlag=dirtyIter->second;
  523. if(dirtyFlag!=DirtyFlag::NONE)
  524. @H_403_239@if((int)dirtyFlag&(int)DirtyFlag::FIXED_PRITORY)
  525. sortEventListenersOfFixedPriority(listenerID);
  526. int)DirtyFlag::SCENE_GRAPH_PRIORITY)
  527. sortEventListenersOfSceneGraPHPriority(listenerID);
  528. dirtyIter->second=DirtyFlag::NONE;
  529. @H_403_239@voidEventDispatcher::sortEventListenersOfSceneGraPHPriority(EventListener::ListenerIDlistenerID)
  530. autolisteners=getListeners(listenerID);
  531. Node*rootNode=(Node*)Director::getInstance()->getRunningScene();
  532. //Resetpriorityindex
  533. _nodePriorityIndex=0;
  534. _nodePriorityMap.clear();
  535. visitTarget(rootNode);
  536. //Aftersort:priority<0,>0
  537. autosceneGraphlisteners=listeners->getSceneGraPHPriorityListeners();
  538. std::sort(sceneGraphlisteners->begin(),sceneGraphlisteners->end(),[this](constEventListener*l1,constEventListener*l2){
  539. @H_403_239@return_nodePriorityMap[l1->getSceneGraPHPriority()]>_nodePriorityMap[l2->getSceneGraPHPriority()];
  540. });
  541. #ifDUMP_LISTENER_ITEM_PRIORITY_INFO
  542. log("-----------------------------------");
  543. for(auto&l:*sceneGraphlisteners)
  544. log("listenerpriority:node([%s]%p),priority(%d)",153); background-color:inherit; font-weight:bold">typeid(*l->_node).name(),l->_node,_nodePriorityMap[l->_node]);
  545. #endif
  546. @H_403_239@voidEventDispatcher::sortEventListenersOfFixedPriority(EventListener::ListenerIDlistenerID)
  547. autolisteners=getListeners(listenerID);
  548. if(listeners==nullptr)
  549. autofixedlisteners=listeners->getFixedPriorityListeners();
  550. std::sort(fixedlisteners->begin(),fixedlisteners->end(),[](returnl1->getFixedPriority()<l2->getFixedPriority();
  551. //FIXME:Shouldusebinarysearch
  552. longindex=0;
  553. for(auto&listener:*fixedlisteners)
  554. @H_403_239@if(listener->getFixedPriority()>=0)
  555. ++index;
  556. listeners->setGt0Index(index);
  557. #ifDUMP_LISTENER_ITEM_PRIORITY_INFO
  558. log("-----------------------------------");
  559. @H_403_239@for(auto&l:*fixedlisteners)
  560. log("listenerpriority:node(%p),fixed(%d)",l->_fixedPriority);
  561. #endif
  562. EventDispatcher::EventListenerVector*EventDispatcher::getListeners(EventListener::ListenerIDlistenerID)
  563. autoiter=_listeners.find(listenerID);
  564. if(iter!=_listeners.end())
  565. @H_403_239@returniter->second; @H_403_239@returnnullptr;
  566. voidEventDispatcher::removeEventListenersForListenerID(EventListener::ListenerIDlistenerID)
  567. autolistenerItemIter=_listeners.find(listenerID);
  568. @H_403_239@if(listenerItemIter!=_listeners.end())
  569. autolisteners=listenerItemIter->second;
  570. autoremoveAllListenersInVector=[&](std::vector<EventListener*>*listenerVector){
  571. if(listenerVector==nullptr)
  572. @H_403_239@for(autoiter=listenerVector->begin();iter!=listenerVector->end();)
  573. l->setRegistered(false);
  574. @H_403_239@if(l->getSceneGraPHPriority()!=nullptr)
  575. iter=listenerVector->erase(iter);
  576. removeAllListenersInVector(sceneGraPHPriorityListeners);
  577. removeAllListenersInVector(fixedPriorityListeners);
  578. if(!_inDispatch)
  579. listeners->clear();
  580. deletelisteners;
  581. _listeners.erase(listenerItemIter);
  582. _priorityDirtyFlagMap.erase(listenerID);
  583. @H_403_239@for(autoiter=_toAddedListeners.begin();iter!=_toAddedListeners.end();) @H_403_239@if((*iter)->getListenerID()==listenerID)
  584. iter=_toAddedListeners.erase(iter);
  585. @H_403_239@voidEventDispatcher::removeEventListeners(EventListener::TypelistenerType)
  586. CCASSERT(listenerType!=EventListener::Type::CUSTOM,"Notsupportcustomeventlistenertype,pleaseuseEventDispatcher::removeCustomEventListenersinstead.");
  587. removeEventListenersForListenerID(static_cast<EventListener::ListenerID>(listenerType));
  588. voidEventDispatcher::removeCustomEventListeners(conststd::string&customEventName)
  589. removeEventListenersForListenerID(std::hash<std::string>()(customEventName));
  590. @H_403_239@voidEventDispatcher::removeAllEventListeners()
  591. std::vector<int>types(_listeners.size());
  592. types.push_back(iter->first);
  593. for(auto&type:types)
  594. removeEventListenersForListenerID(type);
  595. _listeners.clear();
  596. voidEventDispatcher::setEnabled(boolisEnabled)
  597. _isEnabled=isEnabled;
  598. boolEventDispatcher::isEnabled()return_isEnabled;
  599. voidEventDispatcher::setDirtyForNode(Node*node)
  600. //Markthenodedirtyonlywhentherewasaneventlistenerassociateswithit.
  601. @H_403_239@if(_nodeListenersMap.find(node)!=_nodeListenersMap.end())
  602. _dirtyNodes.insert(node);
  603. voidEventDispatcher::setDirty(EventListener::ListenerIDlistenerID,DirtyFlagflag)
  604. autoiter=_priorityDirtyFlagMap.find(listenerID);
  605. if(iter==_priorityDirtyFlagMap.end())
  606. _priorityDirtyFlagMap.insert(std::make_pair(listenerID,flag));
  607. intret=(int)flag|(int)iter->second;
  608. iter->second=(DirtyFlag)ret;
  609. </pre><br>
  610. <br>
  611. <pre></pre>
  612. <pre></pre>
  613. </pre></pre></pre></pre></pre>

猜你在找的Cocos2d-x相关文章