cocos2dx-3.X中对事件处理分析(3)

上一篇中,我们主要分析了EventDispatcher类中如何添加事件,这一篇,来看一下事件的分发处理。
1、
    /** Dispatches the event. 这个函数是事件分发的主入口
     *  Also removes all EventListeners marked for deletion from the
     *  event dispatcher list.
     *
     * @param event The event needs to be dispatched.
     */
void dispatchEvent(Event* event);
-→>>>
void EventDispatcher::dispatchEvent(Event* event)
{
    if (!_isEnabled)
        return;
    
    updateDirtyFlagForSceneGraph();
   
    DispatchGuard guard(_inDispatch);
    //如果是触摸事件,则通过dispatchTouchEvent函数进行处理,这个具体后面再分析
    if (event->getType() == Event::Type::TOUCH)
    {
        dispatchTouchEvent(static_cast<EventTouch*>(event));
        return;
    }
    //获取事件的listenerID
    auto listenerID = __getListenerID(event);
    //对所有的事件监听函数进行排序
    sortEventListeners(listenerID);
    
    auto iter = _listenerMap.find(listenerID);
    if (iter != _listenerMap.end())
    {
        auto listeners = iter->second;
        
        auto onEvent = [&event](EventListener* listener) -> bool{
            event->setCurrentTarget(listener->getAssociatedNode());
            listener->_onEvent(event);
            return event->isStopped();
        };
        //执行具体的事件监听函数
        dispatchEventToListeners(listeners,onEvent);
    }
    
//更新监听事件列表    
updateListeners(event);
}
2、移动设备中,触摸事件很重要,而且这里对触摸事件的分发,单独有一个函数dispatchTouchEvent,这个函数代码太长了,就不进行分析了,其实和2.X的思路是一样的。
3、对于Custom事件,我们可以直接通过下面这个函数进行分发,本质上还是调用dispatchEvent方法。
void EventDispatcher::dispatchCustomEvent(const std::string &eventName,void *optionalUserData)
{
    EventCustom ev(eventName);
    ev.setUserData(optionalUserData);
    dispatchEvent(&ev);
}

相关文章

操作步骤 1、创建cocos2d-x工程 2、新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#defi...
开发环境:OS(WINDOWS 8.1 X64 企业版) cocos2d-x 2.2.1 vs2010 想给vs安装上cocos的模版,执行Install...
把创建项目做成一个批处理,当创建项目时可以省时省力很多。 操作步骤 1、在 E:cocos2d-x-2.2.1toolspr...
https://www.cnblogs.com/JiaoQing/p/3906780.html 四个响应函数 1 EventListenerPhysicsContact* evC...
转载于 http://www.cnblogs.com/kenkofox/p/3926797.html 熟悉js的dom事件或者flash事件的,基本都能立...
ScrollView(滚动容器)加载大量item时会导致游戏界面的卡顿,严重时整个界面会出现卡死的情况。最近项...