83 lines
2.2 KiB
Lua
83 lines
2.2 KiB
Lua
|
EventManager = {}
|
|||
|
EventManager.__index = EventManager
|
|||
|
|
|||
|
function EventManager.New()
|
|||
|
local o = {}
|
|||
|
setmetatable(o, EventManager)
|
|||
|
o.m_listeners = {}
|
|||
|
return o
|
|||
|
end
|
|||
|
|
|||
|
function EventManager:AddEvent(sEventName, fListener, pObj, bOnce)
|
|||
|
if not self.m_listeners[sEventName] then
|
|||
|
self.m_listeners[sEventName] = {}
|
|||
|
end
|
|||
|
table.insert(self.m_listeners[sEventName],{ func = fListener, obj = pObj, once = bOnce } )
|
|||
|
end
|
|||
|
|
|||
|
function EventManager:RemoveEvent(sEventName, fListener, pObj)
|
|||
|
if not self.m_listeners[sEventName] then
|
|||
|
return
|
|||
|
end
|
|||
|
local v
|
|||
|
for i=1, #self.m_listeners[sEventName] do
|
|||
|
v = self.m_listeners[sEventName][i]
|
|||
|
if v.func == fListener and pObj == v.obj then
|
|||
|
table.remove(self.m_listeners[sEventName], i)
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function EventManager:DispatchEvent(sEventName,...)
|
|||
|
if not self.m_listeners[sEventName] then
|
|||
|
return
|
|||
|
end
|
|||
|
local v
|
|||
|
local flag
|
|||
|
local msg
|
|||
|
local args = {...}
|
|||
|
local dispatcher = {}
|
|||
|
|
|||
|
for i=1, #self.m_listeners[sEventName] do
|
|||
|
dispatcher[i] = self.m_listeners[sEventName][i]
|
|||
|
end
|
|||
|
|
|||
|
for i=1, #dispatcher do --因为分发的事件可能修改self.m_listeners结构,所以把数据记录到一个缓存分发器,利用该分发器分发事件
|
|||
|
v = dispatcher[i]
|
|||
|
if not v.obj then
|
|||
|
local func = function() v.func(unpack(args, 1, table.maxn(args))) end
|
|||
|
flag, msg = xpcall(func, tolua.traceback)
|
|||
|
else
|
|||
|
local func = function() v.func(v.obj, unpack(args, 1, table.maxn(args))) end
|
|||
|
flag, msg = xpcall(func, tolua.traceback)
|
|||
|
end
|
|||
|
if not flag then
|
|||
|
--table.remove(self.m_listeners[sEventName],i)
|
|||
|
Log(msg)
|
|||
|
end
|
|||
|
|
|||
|
if v.once then
|
|||
|
self:RemoveEvent(sEventName, v)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function EventManager:HasEvent(sEventName, func)
|
|||
|
if not self.m_listeners[sEventName] or not func then
|
|||
|
return false
|
|||
|
end
|
|||
|
local v
|
|||
|
for i=1, #self.m_listeners[sEventName] do
|
|||
|
v = self.m_listeners[sEventName][i]
|
|||
|
if v.func == func then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function EventManager:ClearEvent()
|
|||
|
self.m_listeners={}
|
|||
|
end
|