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

前端之家收集整理的这篇文章主要介绍了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);
}

猜你在找的Cocos2d-x相关文章