c1_lua/lua/app/module/battle/helper/battle_scheduler.lua
2023-06-06 15:25:21 +08:00

113 lines
3.0 KiB
Lua

local BattleScheduler = {}
local totalSid = 0
function BattleScheduler:init()
self.schedulerList = {}
self.dirty = false
self.timeScale = 1
self.over = false
if self.scheduleId then
ModuleManager.BattleManager:unscheduleGlobal(self.scheduleId)
end
self.scheduleId = ModuleManager.BattleManager:scheduleGlobal(function(dt)
self:update(dt)
end, 0)
end
function BattleScheduler:update(dt)
if #self.schedulerList == 0 then
return
end
if self.dirty then
self.dirty = false
local count = #self.schedulerList
for i = 1, count do
if self.schedulerList[i].waitRemove then
local newCount = i
i = i + 1
while i <= count do
if not self.schedulerList[i].waitRemove then
self.schedulerList[newCount] = self.schedulerList[i]
newCount = newCount + 1
end
i = i + 1
end
for j = 0, count - newCount do
table.remove(self.schedulerList)
end
break
end
end
end
local inter = dt*self.timeScale
for _, info in ipairs(self.schedulerList) do
info.tick = info.tick + inter
if info.tick >= info.inter then
info.tick = info.tick - info.inter
info.waitRemove = true
if info.func then
local s = info.func(inter, dt)
local stop = not info.rep or s
if stop then
self.dirty = true
else
info.waitRemove = false
end
else
self.dirty = true
end
end
end
end
function BattleScheduler:startSchedule(func, inter, rep)
if self.over then
return
end
totalSid = totalSid + 1
local info = {sid = totalSid, inter = inter, tick = 0, func = func, rep = rep}
table.insert(self.schedulerList, info)
return info.sid
end
function BattleScheduler:scheduleGlobal(func, inter)
return self:startSchedule(func, inter, true)
end
function BattleScheduler:performWithDelayGlobal(func, delay)
return self:startSchedule(func, delay, false)
end
function BattleScheduler:unscheduleGlobal(sid)
if self.over then
return
end
for k, info in ipairs(self.schedulerList) do
if info.sid == sid then
info.waitRemove = true
info.func = nil
self.dirty = true
break
end
end
end
function BattleScheduler:setTimeScale(timeScale)
self.timeScale = timeScale
end
function BattleScheduler:clear()
for i = 1, #self.schedulerList do
table.remove(self.schedulerList)
end
self.dirty = false
self.over = true
self.timeScale = 1
if self.scheduleId then
ModuleManager.BattleManager:unscheduleGlobal(self.scheduleId)
self.scheduleId = nil
end
end
return BattleScheduler