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