|
|
- require("utils.Array")
- --[[ 延迟fire的事件
- EventName.ADD_GOODS
- GoodsModel.CHANGE_BAGLIST
- ObjectEventType.MAINROLE_MOVE_EVENT
- EventName.CHANGE_LEVEL
- ]]
- EventSystem = EventSystem or BaseClass()
- local EventSystem = EventSystem
- local table_insert = table.insert
- local table_remove = table.remove
- EventSystem.all_event_count = 88888888
- --事件系统(非单健)
- function EventSystem:__init()
- self.all_event_dic = {}
- self.bind_id_to_event_id_dic = {}
- self.calling_event_dic = {}
- self.need_fire_events = false
- self.fire_callback_queue = false
- end
-
- function EventSystem:CallError(event_id)
- logWarn("death loop:" .. event_id)
- end
-
- --调用已经处于派发队列中的Event
- function EventSystem:Update()
- --timer quest
- --依次执行所有需要触发的事件
- if self.need_fire_events then
- while not List.Empty(self.need_fire_events) do
- local fire_info = List.PopFront(self.need_fire_events)
- if fire_info.event_list then
- for i, event_call_back in pairs(fire_info.event_list) do
- if event_call_back then
- event_call_back(fire_info.arg_list)
- end
- end
- end
- -- fire_info.event(fire_info.arg_list)
- end
- self.need_fire_events = false
- Runner:getInstance():RemoveRunObj(self)
- end
- end
-
- function EventSystem:Bind(event_id, event_func)
- if event_id == nil then
- LogError("Try to bind to a nil event_id")
- --故意报错输出调用堆栈
- print(event_id .. "")
- return
- end
-
- if event_func == nil then
- LogError("Try to bind to a nil event_func")
- --故意报错输出调用堆栈
- print(event_func .. "")
- return
- end
- local event_list = self.all_event_dic[event_id]
- if event_list == nil then
- event_list = {}
- self.all_event_dic[event_id] = event_list
- end
- EventSystem.all_event_count = EventSystem.all_event_count + 1
- self.bind_id_to_event_id_dic[EventSystem.all_event_count] = event_id
- event_list[EventSystem.all_event_count] = event_func
- return EventSystem.all_event_count
- end
-
- function EventSystem:UnBind(bind_id)
- if bind_id == nil then
- return
- end
- local event_id = self.bind_id_to_event_id_dic[bind_id]
- if event_id then
- local calling_event = self.calling_event_dic[event_id]
- if calling_event ~= nil then
- if calling_event == false then
- calling_event = {}
- self.calling_event_dic[event_id] = calling_event
- end
- calling_event[bind_id] = true
- local event_list = EventSystem.getEvent(self, event_id)
- if event_list then
- event_list[bind_id] = false
- end
- return
- end
- self.bind_id_to_event_id_dic[bind_id] = nil
- local event_list = EventSystem.getEvent(self, event_id)
- if event_list then
- event_list[bind_id] = nil
- end
- end
- end
-
- function EventSystem:UnBindAll(is_delete)
- Runner:getInstance():RemoveLateRunObj(self)
- Runner:getInstance():RemoveRunObj(self)
-
- if is_delete then
- self.all_event_dic = nil
- self.bind_id_to_event_id_dic = nil
- self.calling_event_dic = nil
- else
- self.all_event_dic = {}
- self.bind_id_to_event_id_dic = {}
- self.calling_event_dic = {}
- end
-
- self.need_fire_events = false
- self.fire_callback_queue = false
- end
-
- function EventSystem:LateUpdate(now_time, elapse_time)
- if self.fire_callback_queue then
- if self.fire_callback_queue:GetSize() > 0 then
- local call_back = self.fire_callback_queue:PopFront()
- if call_back then
- call_back()
- end
- else
- Runner:getInstance():RemoveLateRunObj(self)
- end
- end
- end
- --每帧触发一个callback
- function EventSystem:DelayFire(event_id, ...)
- if event_id == nil then
- LogError("Try to call EventSystem:Fire() with a nil event_id")
- --故意抛出堆栈
- print(error.msg)
- return
- end
-
- local event_list = EventSystem.getEvent(self, event_id)
- if event_list ~= nil then
- local args = { ... }
- local paramCount = select('#', ...)
- self.fire_callback_queue = self.fire_callback_queue or Array.New()
- for i, event_call_back in pairs(event_list) do
- local function delay_callback()
- if event_list[i] and event_call_back then
- event_call_back(unpack(args, 1, paramCount))
- end
- end
- self.fire_callback_queue:PushBack(delay_callback)
- end
- Runner:getInstance():AddLateRunObj(self, 1)
- end
- end
-
- function EventSystem:ClearDelayFireQueue()
- if self.fire_callback_queue and not self.fire_callback_queue:IsEmpty() then
- self.fire_callback_queue:Clear()
- end
- end
-
- --立即触发
- function EventSystem:Fire(event_id, ...)
- if event_id == nil then
- LogError("Try to call EventSystem:Fire() with a nil event_id")
- --故意抛出堆栈
- print(error.msg)
- return
- end
-
- local event_list = EventSystem.getEvent(self, event_id)
- if event_list then
- self.calling_event_dic[event_id] = false
- for bind_id, event_call_back in pairs(event_list) do
- if event_call_back then
- event_call_back(...)
- end
- end
- local calling_event = self.calling_event_dic[event_id]
- self.calling_event_dic[event_id] = nil
- if calling_event then
- for bind_id, _ in pairs(calling_event) do
- EventSystem.UnBind(self, bind_id)
- end
- end
- end
- end
-
- --下一帧触发
- function EventSystem:FireNextFrame(event_id, ...)
- if event_id == nil then
- LogError("Try to call EventSystem:FireNextFrame() with a nil event_id")
- --故意抛出堆栈
- print(error.msg)
- return
- end
-
- local event_list = EventSystem.getEvent(self, event_id)
- if event_list ~= nil then
- local fire_info = {}
- fire_info.event_id = event_id
- fire_info.event_list = event_list
- fire_info.arg_list = {...}
- if not self.need_fire_events then
- Runner:getInstance():AddRunObj(GlobalEventSystem, 3)
- end
- self.need_fire_events = self.need_fire_events or List.New()
- List.PushBack(self.need_fire_events, fire_info)
- end
- end
-
- function EventSystem:getEvent(event_id)
- return self.all_event_dic[event_id]
- end
-
- function EventSystem:__delete()
- EventSystem.UnBindAll(self, true)
- end
|