GameEvent.lua 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. GameEvent = {}
  2. local _listeners = {}
  3. function GameEvent.add(eventName, func, tag, priority)
  4. if not eventName then
  5. return
  6. end
  7. _listeners[eventName] = _listeners[eventName] or {}
  8. local eventListeners = _listeners[eventName]
  9. for _, v in ipairs(eventListeners) do
  10. if v[2] == tag then
  11. return
  12. end
  13. end
  14. if priority and #eventListeners >= priority then
  15. table.insert(eventListeners, priority, {func, tag})
  16. else
  17. table.insert(eventListeners, {func, tag})
  18. end
  19. end
  20. function GameEvent.remove(func)
  21. for eventName, eventListeners in pairs(_listeners) do
  22. for i = 1, #eventListeners do
  23. if eventListeners[i][1] == func then
  24. table.remove(eventListeners, i)
  25. if 0 == #_listeners[eventName] then
  26. _listeners[eventName] = nil
  27. end
  28. return
  29. end
  30. end
  31. end
  32. end
  33. function GameEvent.removeByNameAndTag(eventName, tag)
  34. assert(tag, "Tag must not be nil")
  35. local eventListeners = _listeners[eventName]
  36. if not eventListeners then return end
  37. for i = #eventListeners, 1, -1 do
  38. if eventListeners[i][2] == tag then
  39. table.remove(eventListeners, i)
  40. break
  41. end
  42. end
  43. if 0 == #eventListeners then
  44. _listeners[eventName] = nil
  45. end
  46. end
  47. function GameEvent.removeByTag(tag)
  48. assert(tag, "Tag must not be nil")
  49. for eventName, eventListeners in pairs(_listeners) do
  50. self.removeListenerByNameAndTag(eventName, tag)
  51. end
  52. end
  53. function GameEvent.removeAll()
  54. _listeners = {}
  55. end
  56. function GameEvent.push(eventName,...)
  57. local eventListeners = _listeners[eventName]
  58. if not eventListeners then
  59. return
  60. end
  61. for _, listener in ipairs(eventListeners) do
  62. local ok, stop = pcall(listener[1],...)
  63. if ok then
  64. if stop then
  65. -- release_print(eventName,"???")
  66. break
  67. end
  68. else
  69. local tag = listener[2]
  70. local tarid = type(tag) == "string" and tag or (tag and tag.ID or 0)
  71. local err = string.format("名称%s id=%s %s" , eventName, tarid,debug.traceback())
  72. error(err,stop)
  73. end
  74. end
  75. end
  76. return GameEvent