| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- BattleEvent={}
- BattleEvent.__index = BattleEvent
- local listPool = BattleObjectPool.New(function ()
- return BattleList.New()
- end)
- local itemPool = BattleObjectPool.New(function ()
- return { func = 0, obj = 0, once = false }
- end)
- function BattleEvent.New()
- local instance = {}
- setmetatable(instance, BattleEvent)
- instance.m_listeners = {}
- return instance
- end
- function BattleEvent:AddEvent(sEventName, fListener, pObj, bOnce)
- if not self.m_listeners[sEventName] then
- self.m_listeners[sEventName] = listPool:Get()
- end
- local item = itemPool:Get()
- item.func = fListener
- item.obj = pObj
- item.once = bOnce
- self.m_listeners[sEventName]:Add(item)
- end
- function BattleEvent:RemoveEvent(sEventName, fListener, pObj)
- if not self.m_listeners[sEventName] then
- return
- end
- local v
- for i=1, self.m_listeners[sEventName].size do
- v = self.m_listeners[sEventName].buffer[i]
- if v.func == fListener and pObj == v.obj then
- itemPool:Put(v)
- self.m_listeners[sEventName]:Remove(i)
- break
- end
- end
- end
- function BattleEvent:DispatchEvent(sEventName, ...)
- if not self.m_listeners[sEventName] then
- return
- end
- local v
- for i=1, self.m_listeners[sEventName].size do
- v = self.m_listeners[sEventName].buffer[i]
- if not v.obj then
- v.func(...)
- else
- v.func(v.obj, ...)
- end
- if v.once then
- self:RemoveEvent(sEventName, v)
- end
- end
- end
- function BattleEvent:ClearEvent()
- for k, v in pairs(self.m_listeners) do
- for i=1, v.size do
- itemPool:Put(v.buffer[i])
- end
- v:Clear()
- listPool:Put(v)
- self.m_listeners[k]=nil
- end
- end
|