lua下的事件分发器
cc.vv = cc.vv or {} cc.vv.eventsListener = {} -- start -- -------------------------------- -- @class function registerEventListener -- @description 注册事件回调 -- @param eventType 事件类型 -- @param target 实例 -- @param method 方法 -- @return -- cc.vv.registerEventListener(2, self, self.eventLis) -- end -- local function registerEventListener(eventType, target, method) if not eventType or not target or not method then return end local eventsListener = cc.vv.eventsListener local listeners = eventsListener[eventType] if not listeners then -- 首次添加eventType类型事件,新建消息存储列表 listeners = {} eventsListener[eventType] = listeners else -- 检查重复添加 for _, listener in ipairs(listeners) do if listener[1] == target and listener[2] == method then return end end end -- 加入到事件列表中 local listener = {target, method} table.insert(listeners, listener) end cc.vv.registerEventListener = registerEventListener -- start -- -------------------------------- -- @class function dispatchEvent -- @description 分发eventType事件 -- @param eventType 事件类型 -- @param ... 调用者传递的参数 -- @return -- end -- local function dispatchEvent(eventType, ...) if not eventType then return end local listeners = cc.vv.eventsListener[eventType] or {} for _, listener in ipairs(listeners) do -- 调用注册函数 listener[2](listener[1], eventType, ...) end end cc.vv.dispatchEvent = dispatchEvent -- start -- -------------------------------- -- @class function removeTargetEventListenerByType -- @description 移除target注册的事件 -- @param target self -- @param eventType 消息类型 -- @return -- end -- local function removeTargetEventListenerByType(target, eventType) if not target or not eventType then return end -- 移除target的注册的eventType类型事件 local listeners = cc.vv.eventsListener[eventType] or {} for i, listener in ipairs(listeners) do if listener[1] == target then table.remove(listeners, i) end end end cc.vv.removeTargetEventListenerByType = removeTargetEventListenerByType -- start -- -------------------------------- -- @class function removeTargetAllEventListener -- @description 移除target的注册的全部事件 -- @param target self -- @return -- end -- local function removeTargetAllEventListener(target) if not target then return end -- 移除target注册的全部事件 for _, listeners in pairs(cc.vv.eventsListener) do for i, listener in ipairs(listeners) do if listener[1] == target then table.remove(listeners, i) end end end end cc.vv.removeTargetAllEventListener = removeTargetAllEventListener -- start -- -------------------------------- -- @class function removeAllEventListener -- @description 移除全部消息注册回调 -- @return -- end -- local function removeAllEventListener() cc.vv.eventsListener = {} end cc.vv.removeAllEventListener = removeAllEventListener
cc.vv是一个全局自定义的表,加入进去方便使用