Cocos2d-x的版本是2.x。
Touch操作主要有如下几种:
CCTouchDelegate::ccTouchBegan()
CCTouchDelegate::ccTouchMoved()
CCTouchDelegate::ccTouchEnded()
CCTouchDelegate::ccTouchCancelled()
=========================================================================
CCTouchDispatcher是个容器,存储CCTouchDelegate对象指针。
当它从上游接收到Touch操作时,就遍历这个容器,通知给每个CCTouchDelegate对象。
CCDirector负责维护CCTouchDispatcher,它有一个成员变量是CCTouchDispatcher对象CCDirector::m_pTouchDispatcher。
下面这句代码用来获取CCDirector::m_pTouchDispatcher:
CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher()
=========================================================================
那么,谁是这个“上游”?谁负责把Touch事件通知给CCDirector::m_pTouchDispatcher?
在Windows操作系统下,是CCEGLView。
CCEGLView负责创建Windows主窗口,维护HWND,也负责处理Windows消息。
当发生Touch事件时,它就通知给基类的CCEGLViewProtocol::m_pDelegate成员变量。
这个CCEGLViewProtocol::m_pDelegate实际上就是CCDirector::m_pTouchDispatcher。
CCEGLViewProtocol::m_pDelegate的类型是EGLTouchDelegate,而CCDirector::m_pTouchDispatcher就是EGLTouchDelegate的派生类。
=========================================================================
Touch事件发生后,谁负责侦听并处理?
CCLayer是最重要的侦听者,它是CCTouchDelegate的派生类。
CCLayer会把自己注册给CCTouchDispatcher。一个控件,如果要侦听触屏事件的话,一定要继承自CCTouchDelegate。
甚至,CCMenu类直接继承自CCLayer
class CC_DLL CCMenu : public CCLayer, public CCRGBAProtocol
每次有Touch事件,每个注册给CCDirector::m_pTouchDispatcher的控件都会收到消息。
在CCMenu::itemForTouch()内部,会判断Touch事件携带的坐标点是否落在CCMenu内部,如果落在内部,说明这个CCMenu被点击了。