‎Cocos2d-x 学习笔记(15.4) EventDispatcher 事件分发具体逻辑 dispatchEventToListeners函数

女生的网名这么多〃 提交于 2020-08-09 17:27:19

dispatchEvent(Event* event)方法在对事件对应的监听器进行重新排序后,进行事件分发操作。具体操作由dispatchEventToListeners方法执行。

该方法声明:

void EventDispatcher::dispatchEventToListeners(EventListenerVector* listeners, const std::function<bool(EventListener*)>& onEvent);

第一个参数时监听器容器Vector,包含了存储两种监听器的容器。

第二个参数是回调函数,在该方法之前进行定义:

auto onEvent = [&event](EventListener* listener) -> bool{
            event->setCurrentTarget(listener->getAssociatedNode());
            listener->_onEvent(event);
            return event->isStopped();
        };

该方法运行流程简而言之,是对Vector内部的所有监听器按优先级从小到大进行遍历,对每个遍历到的监听器,先判断是否可以处理事件,可以后调用参数onEvent,执行回调函数。

接下来,事件分发方法内有以下操作:

bool shouldStopPropagation = false;

// 按优先级遍历,遍历到的每个监听器内执行以下

if (l->isEnabled() && !l->isPaused() && l->isRegistered() && onEvent(l)) { shouldStopPropagation = true; break; }

&&是短路操作,也就是说在执行onEvent之前,需要确保_isEnabled(启用监听器)_paused(没暂停监听器)_isRegistered(已注册监听器)。

当前3个条件确定后,执行回调函数onEvent,先将event和监听器关联的node进行关联,即event标记当前对应的node,再调用监听器的_onEvent进行事件处理。

onEvent返回值是event->isStopped(),当事件停止返回true,否则false。

局部变量shouldStopPropagation标志着是否停止遍历。当onEvent返回true,即event->isStopped()为true,说明事件停止,此时把shouldStopPropagation置true,停止对剩下的监听器遍历。当事件没有停止,则继续对剩下的监听器进行遍历。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!