源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

217 lines
5.6 KiB

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