zoukankan      html  css  js  c++  java
  • ‎Cocos2d-x 学习笔记(15.4) EventDispatcher 事件分发具体逻辑 dispatchEventToListeners函数

    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,停止对剩下的监听器遍历。当事件没有停止,则继续对剩下的监听器进行遍历。

  • 相关阅读:
    【微服务架构】SpringCloud之Ribbon
    SpringCloud之Eureka(注册中心集群篇)
    Eureka简介
    两行代码 搞定计数
    HBase详细概述
    电商项目介绍---说的很好
    面试:----Nginx的一理解
    redis介绍
    Linux操作系统介绍
    什么是Solr
  • 原文地址:https://www.cnblogs.com/deepcho/p/cocos2dx-eventdispatcher-dispatcheventtolisteners.html
Copyright © 2011-2022 走看看