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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值