cocos2d-x 之 EventDispath 小结

本文深入解析Cocos2d-x中的事件监听器类型,包括普通监听器、自定义消息机制、键盘、鼠标及触屏事件。探讨了多点触控的处理方法,自定义消息的创建与派发流程,以及键盘和重力感应事件的监听。通过实例展示了如何使用这些事件监听器来增强游戏交互。
摘要由CSDN通过智能技术生成

 EventListeners事件

EventListener                   普通的监听器

EventListenerCustom             自定义消息机制

EventListenerKeyboard           键盘事件

EventListenerMouse              鼠标点击事件

EventListenerTouchOneByOne      单点事件


//ev  均是使用的监听事件

多个层之间的穿透 ev->setSwallowTouches(true);

多点触控的单点处理

判断是点击的左边还是右边

auto ev = EventListenerTouchOneByOne::create();
          ev->onTouchBegan = [&](Touch*touch, Event*)
          {
               CCLOG("layer 1");
               if (1/* 这次触摸在左侧 */) this->leftTouchId = touch->getID();
               if (1/*  是右侧*/) this->rightTouchId = touch->getID();
               return true;
          };
          ev->onTouchMoved = [&](Touch* touch, Event*){
               //touch->getID() == this->leftTouchId;
          };
 _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, layer);

多点触摸和单点触摸差不多:

消息派发流程


注册回调函数  -->  消息派发模块(_eventDispatcher)     -->  帧循环(绘制场景,派发消息,内存管理)

 

自定义消息,是自己给自己发消息

被调用的地方注册回调函数,调用的地方发送消息,就可以实现通信

创建:

EventListenerCustom* ev = EventListenerCustom::create("MyEvent", CC_CALLBACK_1(T15EventDispath::customEventHande, this));

派发消息:

_eventDispatcher->dispatchCustomEvent("MyEvent");

一个完成的自定义的调用:

鼠标点击一下,就发送消息

EventListenerCustom* ev = EventListenerCustom::create("MyEvent", CC_CALLBACK_1(XXXX::customEventHande, this));
     _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);
    
     {
          EventListenerTouchOneByOne*ev = EventListenerTouchOneByOne::create();
          ev->onTouchBegan = [&](Touch*, Event*){
               this->_eventDispatcher->dispatchCustomEvent("MyEvent", nullptr);
          };
          _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);
               //_eventDispatcher->dispatchCustomEvent("MyEvent");
     }

回调函数的处理:

void XXXX::customEventHande(EventCustom* ev)
{
     ev->getEventName();    //  在这里就就是指的  "MyEvent"
     ev->getUserData();        //   一个指针,不过上面是nullptr
}
//用发消息取代函数的调用,是一种设计上的进步

键盘消息事件:

EventListenerKeyboard* keyev = EventListenerKeyboard::create();
     keyev->onKeyPressed = [](EventKeyboard::KeyCode key, Event*){
          if(key == EventKeyboard::KeyCode::KEY_J)
          {
               // 表示j键被按下
               CCLOG("j is down");
          }
     };
     keyev->onKeyReleased = [](EventKeyboard::KeyCode key, Event*){
          if(key == EventKeyboard::KeyCode::KEY_J)
          {
               // 表示j键被释放
               CCLOG("j is up");
          }
     };
     _eventDispatcher->addEventListenerWithSceneGraphPriority(keyev, this);

重力感应:

     EventListenerAcceleration* ev = EventListenerAcceleration::create(
     [ ](Acceleration*, Event* ev){
     });
     _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);  // 0

消息派发器:

 _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);

第二个参数表示优先级 负的越高,表示优先级越高,正的越高,优先级越低

系统的默认的优先级是0

转载于:https://my.oschina.net/u/1181104/blog/507884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值