Lua 事件触发机制(注册,触发)

日常工作中经常会用到触发机制,这里就提供一个注册触发机制,在代码中在也不用专门去调用各个模块的接口;只需要触发即可,触发后会自动调用接口

直接上代码

Lua 复制代码
local _EventHandle = {};
_EventHandle.listenerHandleIndex = 0
_EventHandle.listenersList = {}

function _EventHandle:AddEventListener(eventName, listener)
    eventName = string.upper(eventName);
        if self.listenersList[eventName] == nil then
            self.listenersList[eventName] = {};
        end

        self.listenerHandleIndex = self.listenerHandleIndex + 1;
        self.listenersList[eventName][self.listenerHandleIndex] = listener;
        return self.listenerHandleIndex;
end

function _EventHandle:dispatchEvent(event)
    event.name = string.upper(event.name);
    local _eventName = event.name;
    if self.listenersList[_eventName] == nil then return; end
    for _index, _listener in pairs(self.listenersList[_eventName]) do
        local ok, _ret = Try(_listener, event)
        if not ok then
            G_logger:warn_format("[_EventHandle:dispatchEvent] Failed, event:%s, err:%s", _eventName, tostring(_ret))
        elseif _ret == "__REMOVE__" then
            self.listenersList[_eventName][_index] = nil;
        end
    end
end

function _EventHandle:removeEventListener(eventName, key)
    eventName = string.upper(eventName);
    if self.listenersList[eventName] == nil then return; end

    for _index, _listener in pairs(self.listenersList[eventName]) do
        if key == _index or key == _listener then
            self.listenersList[eventName][_index] = nil;
            break;
        end
    end
end

function _EventHandle:removeAllEventListenersForEvent(eventName)
    self.listenersList[string.upper(eventName)] = nil;
end

function _EventHandle:removeAllEventListeners()
    self.listenersList = {};
end

return _EventHandle;

AddEventListener:注册接口

dispatchEvent:触发接口

其他的接口都是移除接口

调用

注册:Event:AddEventListener("Event:try_unlock_idcard", __on_event_try_unlock_idcard),__on_event_try_unlock_idcard是回调函数

触发:Event:dispatchEvent({name = "Event:try_unlock_idcard", player = avatar_part.owner, data_type = HotPot_Type.flash_avatar_part_count, value = avatar_part.flash_count})

相关推荐
breeze jiang24 分钟前
Next.js App Router 全栈实战:从 SPA 的 SEO 痛点到服务端组件与 Hydration 水合机制
开发语言·javascript·ecmascript
程序员老陆29 分钟前
Qt::WidgetAttribute 常用属性详解
开发语言·qt
特立独行的猫a3 小时前
Windows安装Rust环境 Clang替代GCC MinGW环境LLVM工具链(详细教程)
开发语言·windows·rust·mingw·环境搭建·llvm
m0_720245019 小时前
1543.统计好三元组(简单)
开发语言·算法
叠层归一研究院10 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
明朝百晓生10 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能
weixin-a1530030831611 小时前
python-装饰器
开发语言·python
我的xiaodoujiao11 小时前
快速学习Python基础知识详细图文教程17--类型注解和断点调试
开发语言·python·学习·测试工具
rockey62713 小时前
基于AScript的Lua脚本语言发布啦
c#·.net·lua·script·动态脚本
leoZ23113 小时前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino