上一篇中,我们主要分析了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);
}
cocos2dx-3.X中对事件处理分析(3)
最新推荐文章于 2021-05-27 09:41:00 发布