-- -- Author: ZensYue -- Date: 2017-10-25 17:51:21 -- TimeManager = TimeManager or BaseClass() function TimeManager:__init() TimeManager.Instance = self self:Reset() end function TimeManager:Reset() self.time_list = {} end function TimeManager.GetInstance() if TimeManager.Instance == nil then TimeManager.Instance = TimeManager.New() end return TimeManager.Instance end --[[ ================================= @Author: ZensYue @DateTime: 2017-10-25 18:05:23 @Description: 不外部调用 ================================= ]] function TimeManager:SetTimeID(update_type,info) self.time_list[update_type] = info end --获取活动定时器ID function TimeManager:GetTimeID(update_type) return self.time_list[update_type] end --取消活动定时器 function TimeManager:CancelTime(update_type) local info = self:GetTimeID(update_type) if not info then return end if info.time_id then GlobalTimerQuest:CancelQuest(info.time_id) end info.time_id = nil info.next_update_time = 0 self:SetTimeID(update_type,info) end --[[ ================================= @Author: ZensYue @DateTime: 2017-10-25 17:54:00 @param: update_type 更新类型 ps:背包... 直接用模块名就好,不用额外加配置 @param: time 几秒后执行(内部转成毫秒) @param: callback 执行回调 @return bool 是否在保护时间内 ================================= ]] function TimeManager:StartTime(update_type,time,callback) local info = self:GetTimeID(update_type) local cur_time = TimeUtil:getClientTimeMs() --当前次还未执行,不做处理 if info and info.next_update_time and info.next_update_time - cur_time > 0 then info.count = info.count or 0 info.count = info.count + 1 return true end --记录转成毫秒 更准确 local next_update_time = cur_time + time*1000 self:CancelTime(update_type) local function func() local info = self:GetTimeID(update_type) --期间有需要刷新,当前次结束再执行一次 if info and info.count and info.count > 0 then if info.callback then info.callback() end info.last_time = TimeUtil:getClientTimeMs() info.count = 0 end self:CancelTime(update_type) end local time_id = GlobalTimerQuest:AddPeriodQuest(func,time,1) --如果第一次或者连续多次超过间隔时间马上执行 --或者极端情况下,上次的还未执行 info.time_id还存在 local count = 1 if not info or info.time_id or not info.last_time or not info.interval or cur_time - info.last_time > info.interval then if callback then callback() end --如果之前的定时器未关,先关掉 if info and info.time_id then self:CancelTime(update_type) end count = 0 end info = { time_id = time_id, --定时器ID next_update_time = next_update_time, --下次执行的时间 interval = time*1000, --间隔时间 count = count, --间隔时间内需要执行的数量 callback = callback --回调函数 } self:SetTimeID(update_type,info) return false end --[[ ================================= --一定时间内只刷一次 @param: update_type 更新类型 ps:背包... 直接用模块名就好,不用额外加配置 @param: time 几秒后执行(内部转成毫秒) @param: callback 执行回调 @return bool 是否在保护时间内 ================================= ]] function TimeManager:StartDalayTime(update_type,time,callback) local info = self:GetTimeID(update_type) local cur_time = TimeUtil:getClientTimeMs() --当前次还未执行,不做处理 if info and info.next_update_time and info.next_update_time - cur_time > 0 then info.count = info.count or 0 info.count = info.count + 1 return true end --记录转成毫秒 更准确 local next_update_time = cur_time + time*1000 self:CancelTime(update_type) local function func() local info = self:GetTimeID(update_type) --期间有需要刷新,当前次结束再执行一次 if info then if info.callback then info.callback() end info.last_time = TimeUtil:getClientTimeMs() info.count = 0 end self:CancelTime(update_type) end local time_id = GlobalTimerQuest:AddPeriodQuest(func,time,1) --如果第一次或者连续多次超过间隔时间马上执行 --或者极端情况下,上次的还未执行 info.time_id还存在 local count = 1 if not info or info.time_id or not info.last_time or not info.interval or cur_time - info.last_time > info.interval then --如果之前的定时器未关,先关掉 if info and info.time_id then self:CancelTime(update_type) end count = 0 end info = { time_id = time_id, --定时器ID next_update_time = next_update_time, --下次执行的时间 interval = time*1000, --间隔时间 count = count, --间隔时间内需要执行的数量 callback = callback --回调函数 } self:SetTimeID(update_type,info) return false end function TimeManager:__delete() end