BattleEvent.lua 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. BattleEvent={}
  2. BattleEvent.__index = BattleEvent
  3. local listPool = BattleObjectPool.New(function ()
  4. return BattleList.New()
  5. end)
  6. local itemPool = BattleObjectPool.New(function ()
  7. return { func = 0, obj = 0, once = false }
  8. end)
  9. function BattleEvent.New()
  10. local instance = {}
  11. setmetatable(instance, BattleEvent)
  12. instance.m_listeners = {}
  13. return instance
  14. end
  15. function BattleEvent:AddEvent(sEventName, fListener, pObj, bOnce)
  16. if not self.m_listeners[sEventName] then
  17. self.m_listeners[sEventName] = listPool:Get()
  18. end
  19. local item = itemPool:Get()
  20. item.func = fListener
  21. item.obj = pObj
  22. item.once = bOnce
  23. self.m_listeners[sEventName]:Add(item)
  24. end
  25. function BattleEvent:RemoveEvent(sEventName, fListener, pObj)
  26. if not self.m_listeners[sEventName] then
  27. return
  28. end
  29. local v
  30. for i=1, self.m_listeners[sEventName].size do
  31. v = self.m_listeners[sEventName].buffer[i]
  32. if v.func == fListener and pObj == v.obj then
  33. itemPool:Put(v)
  34. self.m_listeners[sEventName]:Remove(i)
  35. break
  36. end
  37. end
  38. end
  39. function BattleEvent:DispatchEvent(sEventName, ...)
  40. if not self.m_listeners[sEventName] then
  41. return
  42. end
  43. local v
  44. for i=1, self.m_listeners[sEventName].size do
  45. v = self.m_listeners[sEventName].buffer[i]
  46. if not v.obj then
  47. v.func(...)
  48. else
  49. v.func(v.obj, ...)
  50. end
  51. if v.once then
  52. self:RemoveEvent(sEventName, v)
  53. end
  54. end
  55. end
  56. function BattleEvent:ClearEvent()
  57. for k, v in pairs(self.m_listeners) do
  58. for i=1, v.size do
  59. itemPool:Put(v.buffer[i])
  60. end
  61. v:Clear()
  62. listPool:Put(v)
  63. self.m_listeners[k]=nil
  64. end
  65. end