Lua学习随感之一Lua事件管理类

前言

相信任何一个游戏项目缺少不了事件,自然而然的缺少不了要有个事件管理器,下面来给大家做一个Lua端的事件管理器,话不多说,先上代码在解析

代码

-- 这里继承单例类,把类做成单例类
EventMessager = BaseClass('EventMessager', Singleton)
EventMessager.eventTable = {}

-- 侦听事件
function EventMessager:AddListener(eventName, funCallback)
    -- print('AddListener',self)
    assert(funCallback)
    EventMessager.eventTable[eventName] = EventMessager.eventTable[eventName] or {}
    local event = EventMessager.eventTable[eventName]
    table.insert(event, funCallback)
end

-- 发布事件
function EventMessager:DispatchEvent(eventName, ...)
    -- print('DispatchEvent',self)
    if eventName ~= nil then
        if EventMessager.eventTable[eventName] ~= nil then
            for k, funCallback in pairs(EventMessager.eventTable[eventName]) do
                funCallback(...)
            end
        end
    end
end

-- 移除事件
function EventMessager:RemoveListener(eventName)
    --  print('RemoveListener',self)
    if eventName ~= nil then
        if EventMessager.eventTable[eventName] ~= nil then
            table.remove(EventMessager.eventTable[eventName])
        end
    end
end



return EventMessager

说明

  1. 相信大家看到这代码会感到很熟悉,因为和C#端的是有点相似的(简直一模一样),除了语法上有些差别。
  2. 单例类我在这里Lua学习随感之一Lua的单例模式有解析
  3. eventTable用来保存事件名+回调方法。
  4. 插入表操作table.insert(event, funCallback)和移除表操作table.remove(EventMessager.eventTable[eventName])
  5. 谨记:有侦听事件必要有移除事件,两者缺一不可
  6. 本代码适合初学者学习用,可能在性能上还有待提高

调用方法

-- click是事件名,随便设置。
EventMessager:GetInstance():AddListener('click',Handle)
-- 这里我随便加了几个参数,说明一下如何传参
EventMessager:GetInstance():DispatchEvent('click','sdfsa',true,'2434')

function Handle(a,b,c)
    print('listeneer handle',a,b,c)
    EventMessager:GetInstance():RemoveListener('click')
end

PS:别忘了,EventMessager,Singleton,BaseClass都是需要事先require的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值