| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- --[[
- 顺序执行设定代码
- ]]
- local ExecuteSequenceMgr = class('ExecuteSequenceMgr')
- local executeSequenceDatas = nil
- local executeSequenceDataNum = nil
- function ExecuteSequenceMgr:ctor()
- executeSequenceDatas = {}
- executeSequenceDataNum = 0
- self:RegisterEvent()
- end
- function ExecuteSequenceMgr:Destroy()
- self:UnRegisterEvent()
- if executeSequenceDatas and executeSequenceDataNum then
- for i = 1, executeSequenceDataNum do
- executeSequenceDatas[i]:Dispose()
- end
- end
- executeSequenceDatas = nil
- executeSequenceDataNum = nil
- end
- function ExecuteSequenceMgr:RegisterEvent()
- ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_FILLCONTENT_COMPELETED, self, self._UIOpenCompleted)
- ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self._UICloseCompleted)
- ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self._UIViewOpenAnimEnd)
- ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self._UIViewCloseAnimEnd)
- ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.STORY_DATA_CHANGED, self, self._OnStoryDataChanged)
- end
- function ExecuteSequenceMgr:UnRegisterEvent()
- ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_FILLCONTENT_COMPELETED, self, self._UIOpenCompleted)
- ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self._UICloseCompleted)
- ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self._UIViewOpenAnimEnd)
- ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self._UIViewCloseAnimEnd)
- ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.STORY_DATA_CHANGED, self, self._OnStoryDataChanged)
- end
- function ExecuteSequenceMgr:SkipToStep(executeSequenceData, stepId)
- if not executeSequenceData then return end
- if not executeSequenceData:GetIsExecuting() then return end
- local len = executeSequenceData:GetExecuteDataLength()
- if stepId < len then len = stepId end
- executeSequenceData:StopTimer()
- for i = 1, len - 1 do
- executeSequenceData:RemoveCurExecuteData()
- end
- self:_Execute(executeSequenceData)
- end
- function ExecuteSequenceMgr:Execute(executeSequenceData)
- if not executeSequenceData then return end
- executeSequenceDataNum = executeSequenceDataNum + 1
- executeSequenceDatas[executeSequenceDataNum] = executeSequenceData
- if executeSequenceData:GetIsExecuting() then return end
- executeSequenceData:SetIsExecuting(true)
- self:_Execute(executeSequenceData)
- end
- function ExecuteSequenceMgr:Exit(executeSequenceData)
- if not executeSequenceData then return end
- if not executeSequenceData:GetIsExecuting() then return end
- self:_Exit(executeSequenceData)
- end
- function ExecuteSequenceMgr:_Execute(executeSequenceData)
- local data = executeSequenceData:GetCurExecuteData()
- local isError = true
- while data do
- local type = data.type
- if type == Enum.ExecuteSequenceType.Func then
- executeSequenceData:RemoveCurExecuteData()
- if self:_ExecuteFunc(data) then
- data = executeSequenceData:GetCurExecuteData()
- else
- break
- end
- elseif type == Enum.ExecuteSequenceType.Listener then
- self:_ExecuteListenerTimeOut(executeSequenceData, data)
- if not self:_ExecuteAfterListener(executeSequenceData) then
- isError = false
- end
- break
- elseif type == Enum.ExecuteSequenceType.UIViewFunc then
- executeSequenceData:RemoveCurExecuteData()
- if self:_ExecuteUIViewFunc(data) then
- data = executeSequenceData:GetCurExecuteData()
- else
- break
- end
- elseif type == Enum.ExecuteSequenceType.Interval then
- self:_ExecuteInterval(executeSequenceData, data)
- isError = false
- break
- elseif type == Enum.ExecuteSequenceType.FuncAfterListener or type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
- LogError("execute error, " .. tostring(type) .. ' Can\'t execute this')
- break
- else
- LogError("execute error, unkown type " .. tostring(type))
- break
- end
- end
- if isError then
- self:_Exit(executeSequenceData)
- end
- end
- function ExecuteSequenceMgr:_ExecuteAfterListener(executeSequenceData)
- local data = executeSequenceData:GetNextExecuteData()
- local isError = false
- while data do
- local type = data.type
- if type == Enum.ExecuteSequenceType.FuncAfterListener then
- executeSequenceData:RemoveNextExecuteData()
- if self:_ExecuteFunc(data) then
- data = executeSequenceData:GetNextExecuteData()
- else
- isError = true
- break
- end
- elseif type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
- executeSequenceData:RemoveNextExecuteData()
- if self:_ExecuteUIViewFunc(data) then
- data = executeSequenceData:GetNextExecuteData()
- else
- isError = true
- break
- end
- else
- break
- end
- end
- return isError
- end
- function ExecuteSequenceMgr:_Exit(executeSequenceData)
- if not executeSequenceData then return end
- executeSequenceData:SetIsExecuting(false)
- for i = 1, executeSequenceData:GetExecuteDataLength() do
- local data = executeSequenceData:GetExecuteDataByIdx(i)
- if data.forceAfterErr then
- local type = data.type
- if type == Enum.ExecuteSequenceType.Func or type == Enum.ExecuteSequenceType.FuncAfterListener then
- self:_ExecuteFunc(data)
- -- elseif data.type == ExecuteSequenceType.Listener then
- elseif type == Enum.ExecuteSequenceType.UIViewFunc or type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
- self:_ExecuteUIViewFunc(data)
- -- elseif data.type == ExecuteSequenceType.Interval then
- end
- end
- end
- for i = executeSequenceDataNum, 1, -1 do
- if executeSequenceDatas[i] == executeSequenceData then
- table.remove(executeSequenceDatas, i)
- executeSequenceDataNum = executeSequenceDataNum - 1
- end
- end
- executeSequenceData:Dispose()
- end
- function ExecuteSequenceMgr:_UIOpenCompleted(owner)
- for i = 1, executeSequenceDataNum do
- self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_FILLCONTENT_COMPELETED, owner.uiData.id)
- end
- end
- function ExecuteSequenceMgr:_UICloseCompleted(owner)
- for i = 1, executeSequenceDataNum do
- self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_CLOSE_COMPELETED, owner.uiData.id)
- end
- end
- function ExecuteSequenceMgr:_UIViewOpenAnimEnd(id)
- for i = 1, executeSequenceDataNum do
- self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_PAGE_IN_END_NTF, id)
- end
- end
- function ExecuteSequenceMgr:_UIViewCloseAnimEnd(id)
- for i = 1, executeSequenceDataNum do
- self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_PAGE_OUT_END_NTF, id)
- end
- end
- function ExecuteSequenceMgr:_OnStoryDataChanged()
- for i = 1, executeSequenceDataNum do
- self:_ExecuteListener(executeSequenceDatas[i], UIEventNames.STORY_DATA_CHANGED)
- end
- end
- function ExecuteSequenceMgr:_ExecuteFunc(data)
- local ok, err
- if data.ownerFunc then
- if data.owner then
- ok, err = RO_XPCALL(data.ownerFunc, debug.traceback, data.owner, unpack(data.args))
- else
- ok, err = RO_XPCALL(data.ownerFunc, debug.traceback, unpack(data.args))
- end
- end
- if not ok then
- if data.args and #data.args > 0 then
- local argStr = 'args ('
- for i = 1, #data.args do
- if i == 1 then
- argStr = argStr .. tostring(data.args[i])
- else
- argStr = argStr .. ',' .. tostring(data.args[i])
- end
- end
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteFunc error ! ' .. argStr .. ')' .. ' ' .. tostring(err))
- else
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteFunc error ! ' .. tostring(err))
- end
- end
- return ok
- end
- function ExecuteSequenceMgr:_ExecuteUIListener(executeSequenceData, eventName, id)
- if not executeSequenceData then return end
- local data = executeSequenceData:GetCurExecuteData()
- if not data then return end
- if data.type == Enum.ExecuteSequenceType.Listener and data.eventName == eventName and data.id == id then
- self:_ExecuteListenerComplete(executeSequenceData)
- end
- end
- function ExecuteSequenceMgr:_ExecuteListener(executeSequenceData, eventName)
- if not executeSequenceData then return end
- local data = executeSequenceData:GetCurExecuteData()
- if not data then return end
- if data.type == Enum.ExecuteSequenceType.Listener and data.eventName == eventName then
- self:_ExecuteListenerComplete(executeSequenceData)
- end
- end
- function ExecuteSequenceMgr:_ExecuteListenerComplete(executeSequenceData)
- executeSequenceData:StopTimer()
- executeSequenceData:RemoveCurExecuteData()
- self:_Execute(executeSequenceData)
- end
- function ExecuteSequenceMgr:_ExecuteListenerTimeOut(executeSequenceData, data)
- if data.duration then
- executeSequenceData:StartTimer(function()
- self:_Exit(executeSequenceData)
- end, data)
- end
- return true
- end
- function ExecuteSequenceMgr:_ExecuteUIViewFunc(data)
- local uibase = ManagerContainer.LuaUIMgr:GetPage(data.id)
- if not uibase then
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find UIBase ' .. tostring(data.id))
- return false
- end
- local luaTable = uibase.MLuaTable
- if not luaTable then
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find UIBase\'s luatable ' .. tostring(data.id))
- return false
- end
- local func = luaTable[data.funcName]
- if type(func) ~= 'function' then
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find ' .. tostring(data.funcName) .. 'is not exist or not function in UIBase\'s luatable' .. tostring(data.id))
- return false
- end
- local ok, err = RO_XPCALL(func, debug.traceback, luaTable, unpack(data.args))
- if not ok then
- if data.args and #data.args > 0 then
- local argStr = 'args ('
- for i = 1, #data.args do
- if i == 1 then
- argStr = argStr .. tostring(data.args[i])
- else
- argStr = argStr .. ',' .. tostring(data.args[i])
- end
- end
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc fun error ! ' .. argStr .. ')' .. ' ' .. tostring(err))
- else
- LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc fun error ! ' .. tostring(err))
- end
- return false
- end
- return ok
- end
- function ExecuteSequenceMgr:_ExecuteInterval(executeSequenceData, data)
- if data.duration then
- executeSequenceData:StartTimer(function()
- self:_ExecuteIntervalComplete(executeSequenceData)
- end, data)
- else
- self:_ExecuteIntervalComplete(executeSequenceData)
- end
- return true
- end
- function ExecuteSequenceMgr:_ExecuteIntervalComplete(executeSequenceData)
- executeSequenceData:StopTimer()
- executeSequenceData:RemoveCurExecuteData()
- self:_Execute(executeSequenceData)
- end
- return ExecuteSequenceMgr
|