Fork me on GitHub

Lua 事件系统

要求:实现事件的监听、移除、派发

	
local EventSystem = {}


	
local this = EventSystem


	
this.mEventTable = {}


	
this.mObjTable = {}


	
 


	
 


	
--注册事件


	
function EventSystem:AddListener(eventName, handler, obj)


	
    


	
    if eventName == nil or (type(eventName) ~= 'string') and (type(eventName) ~= 'number') then


	
        print('EventSystem::AddListener -> eventName must be string or number')


	
    end


	
 


	
    if handler == nil or (type(handler) ~= 'function') then


	
        print('EventSystem::AddListener -> handler must be funciton')


	
    end


	
 


	
    this.mObjTable[obj] = this.mObjTable[obj] or {}


	
 


	
    table.insert(this.mObjTable[obj], {eventName, handler})


	
 


	
 


	
    this.mEventTable[eventName] = this.mEventTable[eventName] or {}


	
 


	
    table.insert(this.mEventTable[eventName], handler)


	
 


	
end


	
 


	
 


	
--移除事件


	
function EventSystem:RemoveListener(eventName, handler)


	
    --print('EventSystem::RemoveListener')


	
    --print(eventName, handler)


	
    if not eventName or not this.mEventTable[eventName] then


	
        print('EventSystem::RemoveListener -> Can\'t find eventName'..eventName)


	
        return


	
    end


	
 


	
    for k, v in pairs(this.mEventTable[eventName]) do


	
     


	
        if v == handler then


	
           table.remove(this.mEventTable[eventName], k)


	
        end


	
    end


	
 


	
end


	
 


	
 


	
--派发消息


	
function EventSystem:Dispatch(event)


	
    print('EventSystem::Dispatch '.. event)


	
   


	
    if not event or  this.mEventTable[event] == nil then


	
        return


	
    end


	
 


	
    for k, v in pairs(this.mEventTable[event]) do


	
        v()


	
    end


	
 


	
end


	
 


	
-- 移除对象对应的监听


	
function EventSystem:RemoveObjectListeners(Obj)


	
    if not Obj or not this.mObjTable[Obj] then


	
        return


	
    end


	
 


	
    for k, v in pairs(this.mObjTable[Obj]) do


	
       


	
        EventSystem:RemoveListener(v[1], v[2])


	
 


	
    end


	
 


	
    this.mObjTable[Obj] = nil


	
 


	
end


	
 


	
return EventSystem
posted @   ZTianming  阅读(362)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
欢迎阅读『Lua 事件系统』

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示