zoukankan      html  css  js  c++  java
  • 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是一个全局自定义的表,加入进去方便使用

  • 相关阅读:
    POJ2516 构图+k次费用流
    POJ 1511 最短路径之和(spfa或dijkstra+heap)
    windows中配置mongodb
    原型设计
    Erlang的参考资源
    用Erlang实现递归查找文件
    list相关的习题
    springmvc基础知识
    汇编实验4
    实验3 转移指令跳转原理及其简单应用编程
  • 原文地址:https://www.cnblogs.com/zhangthree/p/11906227.html
Copyright © 2011-2022 走看看