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是一个全局自定义的表,加入进去方便使用

  • 相关阅读:
    【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
    【算法】LRU算法
    细说分布式锁
    【Python】Python3.4+Matplotlib详细安装教程
    LoRaWAN协议(二)--LoRaWAN MAC数据包格式
    LoRaWAN移植笔记(一)__RTC闹钟链表的实现
    cJSON_json包的C语言解析库
    LoRaWAN协议(一)--架构解析
    STM32L051 PVD的调试
    以帧为存储单位的循环stack
  • 原文地址:https://www.cnblogs.com/zhangthree/p/11906227.html
Copyright © 2011-2022 走看看