BattleEvent.lua 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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
  66. -- 此处函数需要验证 pObj 为隐式 在战斗逻辑缺少对视图层个 clone 此方法暂未实现
  67. function BattleEvent:Clone()
  68. local instance = BattleEvent.New()
  69. -- if #self.m_listeners <= 0 then
  70. -- return
  71. -- end
  72. -- local v
  73. -- for sEventName,listPool in pairs(self.m_listeners) do
  74. -- for i=1, self.m_listeners[sEventName].size do
  75. -- v = self.m_listeners[sEventName].buffer[i]
  76. -- if v.func == fListener and pObj == v.obj then
  77. -- itemPool:Put(v)
  78. -- self.m_listeners[sEventName]:Remove(i)
  79. -- break
  80. -- end
  81. -- end
  82. -- end
  83. return instance
  84. end