【cocos2d-x 3.x】03-浅谈cocos消息分发机制(上)

来源:互联网 发布:中国足球数据库 编辑:程序博客网 时间:2024/05/16 11:28

如何注册触摸消息

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");

0 0
原创粉丝点击