如何注册触摸消息
2.x的触摸消息
在cocos2.x版本中,我们使用CCLayer中的setTouchEnabled和setTouchMode注册触摸消息,并实现ccTouchBegan、ccTouchMoved等虚函数来响应触摸消息
setTouchEnabled(true); //允许触摸
setTouchMode(kCCTouchesOneByOne); //接收触摸消息模式为单点触摸
//设置玩这些后,我们还需要实现这几个虚函数
//触摸开始,如果返回值为true,则继续响应move和end消息
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent*pEvent);
//触摸点移动
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent*pEvent);
//触摸结束
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent*pEvent);
3.x的消息(EventDispatcher)
在3.x中,触摸消息不再是Layer的专利,所有Node都可以处理、注册消息
事件监听优先级
addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给SceneGraphPriority 使用的
FixedPriority listener添加完之后需要手动remove,而SceneGraphPrioritylistener是跟node绑定的,在node的析构函数中会被移除
消息分发器
_eventDispatcher是Node的成员,通过它管理当前节点(场景、层、精灵等)的所有事件的分发。但它本身是一个单例模式值的引用,在Node的构造函数中,通过Director::getInstance()->getEventDispatcher(); 获取,有了这个属性,就能方便的处理事件
触摸事件
//创建单点触摸监听
auto evTouch = EventListenerTouchOneByOne::create();
evTouch->onTouchBegan= CC_CALLBACK_2(HelloWorld::onTouchBegan,this); //用函数指针方式
evTouch->onTouchMoved= [](Touch*,Event*){}; //用lambda表达式方式
evTouch->setSwallowTouches(true);//是否向下传递
//注册到监听队列,优先级默认为0
this->_eventDispatcher->addEventListenerWithSceneGraphPriority(evTouch,this);
键盘、鼠标、加速器事件同理
auto evKb = EventListenerKeyboard::create();
evKb->onKeyPressed= CC_CALLBACK_2(HelloWorld::onKeyPressed,this);
evKb->onKeyReleased= [](EventKeyboard::KeyCode, Event*){};
_eventDispatcher->addEventListenerWithSceneGraphPriority(evKb,this);
自定义事件
注册自定义事件
//创建一个自定义事件,被触发时,会输出helloharry
auto evCustom = EventListenerCustom::create("harry", []{log("helloharry"); });
//注册自定义消息
_eventDispatcher->addEventListenerWithSceneGraphPriority(evCustom,this);
触发自定义事件
_eventDispatcher->dispatchCustomEvent("harry");