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

  • 相关阅读:
    fstream的使用方法
    Java按键事件KeyEvent
    java之 22天 GUI 图形界面编程(二)
    java之 22天 GUI 图形界面编程(一)
    java使用省略号代替多参数(参数类型... 参数名)
    jsoup
    C++获得本机所有网卡的IP和MAC地址信息
    otl中遇到的一些字符数组长度问题
    otl使用存储过程或是LEFT JOIN时提示输出类型未知的问题
    Android:布局实例之常见用户设置界面
  • 原文地址:https://www.cnblogs.com/deepcho/p/cocos2dx-eventdispatcher-dispatcheventtolisteners.html
Copyright © 2011-2022 走看看