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

如何注册触摸消息

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值