cocos2d-x 之 EventDispath 小结

 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

你可能感兴趣的:(cocos2d-x 之 EventDispath 小结)