源战役客户端
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

216 righe
5.6 KiB

4 settimane fa
  1. require("utils.Array")
  2. --[[ 延迟fire的事件
  3. EventName.ADD_GOODS
  4. GoodsModel.CHANGE_BAGLIST
  5. ObjectEventType.MAINROLE_MOVE_EVENT
  6. EventName.CHANGE_LEVEL
  7. ]]
  8. EventSystem = EventSystem or BaseClass()
  9. local EventSystem = EventSystem
  10. local table_insert = table.insert
  11. local table_remove = table.remove
  12. EventSystem.all_event_count = 88888888
  13. --事件系统(非单健)
  14. function EventSystem:__init()
  15. self.all_event_dic = {}
  16. self.bind_id_to_event_id_dic = {}
  17. self.calling_event_dic = {}
  18. self.need_fire_events = false
  19. self.fire_callback_queue = false
  20. end
  21. function EventSystem:CallError(event_id)
  22. logWarn("death loop:" .. event_id)
  23. end
  24. --调用已经处于派发队列中的Event
  25. function EventSystem:Update()
  26. --timer quest
  27. --依次执行所有需要触发的事件
  28. if self.need_fire_events then
  29. while not List.Empty(self.need_fire_events) do
  30. local fire_info = List.PopFront(self.need_fire_events)
  31. if fire_info.event_list then
  32. for i, event_call_back in pairs(fire_info.event_list) do
  33. if event_call_back then
  34. event_call_back(fire_info.arg_list)
  35. end
  36. end
  37. end
  38. -- fire_info.event(fire_info.arg_list)
  39. end
  40. self.need_fire_events = false
  41. Runner:getInstance():RemoveRunObj(self)
  42. end
  43. end
  44. function EventSystem:Bind(event_id, event_func)
  45. if event_id == nil then
  46. LogError("Try to bind to a nil event_id")
  47. --故意报错输出调用堆栈
  48. print(event_id .. "")
  49. return
  50. end
  51. if event_func == nil then
  52. LogError("Try to bind to a nil event_func")
  53. --故意报错输出调用堆栈
  54. print(event_func .. "")
  55. return
  56. end
  57. local event_list = self.all_event_dic[event_id]
  58. if event_list == nil then
  59. event_list = {}
  60. self.all_event_dic[event_id] = event_list
  61. end
  62. EventSystem.all_event_count = EventSystem.all_event_count + 1
  63. self.bind_id_to_event_id_dic[EventSystem.all_event_count] = event_id
  64. event_list[EventSystem.all_event_count] = event_func
  65. return EventSystem.all_event_count
  66. end
  67. function EventSystem:UnBind(bind_id)
  68. if bind_id == nil then
  69. return
  70. end
  71. local event_id = self.bind_id_to_event_id_dic[bind_id]
  72. if event_id then
  73. local calling_event = self.calling_event_dic[event_id]
  74. if calling_event ~= nil then
  75. if calling_event == false then
  76. calling_event = {}
  77. self.calling_event_dic[event_id] = calling_event
  78. end
  79. calling_event[bind_id] = true
  80. local event_list = EventSystem.getEvent(self, event_id)
  81. if event_list then
  82. event_list[bind_id] = false
  83. end
  84. return
  85. end
  86. self.bind_id_to_event_id_dic[bind_id] = nil
  87. local event_list = EventSystem.getEvent(self, event_id)
  88. if event_list then
  89. event_list[bind_id] = nil
  90. end
  91. end
  92. end
  93. function EventSystem:UnBindAll(is_delete)
  94. Runner:getInstance():RemoveLateRunObj(self)
  95. Runner:getInstance():RemoveRunObj(self)
  96. if is_delete then
  97. self.all_event_dic = nil
  98. self.bind_id_to_event_id_dic = nil
  99. self.calling_event_dic = nil
  100. else
  101. self.all_event_dic = {}
  102. self.bind_id_to_event_id_dic = {}
  103. self.calling_event_dic = {}
  104. end
  105. self.need_fire_events = false
  106. self.fire_callback_queue = false
  107. end
  108. function EventSystem:LateUpdate(now_time, elapse_time)
  109. if self.fire_callback_queue then
  110. if self.fire_callback_queue:GetSize() > 0 then
  111. local call_back = self.fire_callback_queue:PopFront()
  112. if call_back then
  113. call_back()
  114. end
  115. else
  116. Runner:getInstance():RemoveLateRunObj(self)
  117. end
  118. end
  119. end
  120. --每帧触发一个callback
  121. function EventSystem:DelayFire(event_id, ...)
  122. if event_id == nil then
  123. LogError("Try to call EventSystem:Fire() with a nil event_id")
  124. --故意抛出堆栈
  125. print(error.msg)
  126. return
  127. end
  128. local event_list = EventSystem.getEvent(self, event_id)
  129. if event_list ~= nil then
  130. local args = { ... }
  131. local paramCount = select('#', ...)
  132. self.fire_callback_queue = self.fire_callback_queue or Array.New()
  133. for i, event_call_back in pairs(event_list) do
  134. local function delay_callback()
  135. if event_list[i] and event_call_back then
  136. event_call_back(unpack(args, 1, paramCount))
  137. end
  138. end
  139. self.fire_callback_queue:PushBack(delay_callback)
  140. end
  141. Runner:getInstance():AddLateRunObj(self, 1)
  142. end
  143. end
  144. function EventSystem:ClearDelayFireQueue()
  145. if self.fire_callback_queue and not self.fire_callback_queue:IsEmpty() then
  146. self.fire_callback_queue:Clear()
  147. end
  148. end
  149. --立即触发
  150. function EventSystem:Fire(event_id, ...)
  151. if event_id == nil then
  152. LogError("Try to call EventSystem:Fire() with a nil event_id")
  153. --故意抛出堆栈
  154. print(error.msg)
  155. return
  156. end
  157. local event_list = EventSystem.getEvent(self, event_id)
  158. if event_list then
  159. self.calling_event_dic[event_id] = false
  160. for bind_id, event_call_back in pairs(event_list) do
  161. if event_call_back then
  162. event_call_back(...)
  163. end
  164. end
  165. local calling_event = self.calling_event_dic[event_id]
  166. self.calling_event_dic[event_id] = nil
  167. if calling_event then
  168. for bind_id, _ in pairs(calling_event) do
  169. EventSystem.UnBind(self, bind_id)
  170. end
  171. end
  172. end
  173. end
  174. --下一帧触发
  175. function EventSystem:FireNextFrame(event_id, ...)
  176. if event_id == nil then
  177. LogError("Try to call EventSystem:FireNextFrame() with a nil event_id")
  178. --故意抛出堆栈
  179. print(error.msg)
  180. return
  181. end
  182. local event_list = EventSystem.getEvent(self, event_id)
  183. if event_list ~= nil then
  184. local fire_info = {}
  185. fire_info.event_id = event_id
  186. fire_info.event_list = event_list
  187. fire_info.arg_list = {...}
  188. if not self.need_fire_events then
  189. Runner:getInstance():AddRunObj(GlobalEventSystem, 3)
  190. end
  191. self.need_fire_events = self.need_fire_events or List.New()
  192. List.PushBack(self.need_fire_events, fire_info)
  193. end
  194. end
  195. function EventSystem:getEvent(event_id)
  196. return self.all_event_dic[event_id]
  197. end
  198. function EventSystem:__delete()
  199. EventSystem.UnBindAll(self, true)
  200. end