--scale false 采用deltaTime计时,true 采用 unscaledDeltaTime计时
|
|
|
|
--初略的版本 以后有时间再优化完善
|
|
TimerQuest = TimerQuest or BaseClass()
|
|
local TimerQuest = TimerQuest
|
|
local Time = Time
|
|
local Status = Status
|
|
local Array = Array
|
|
local table_insert = table.insert
|
|
local table_sort = table.sort
|
|
function TimerQuest:__init()
|
|
self.timer_list = {}
|
|
self.update_delta_time = 0
|
|
self.timer_list2 = {}
|
|
self.update_delta_time2 = 0
|
|
self.timer_list3 = {}
|
|
self.update_delta_time3 = 0
|
|
|
|
self.update_count = 0
|
|
self.waitfor_call_back_list = false
|
|
self.timer_list_index = 0
|
|
self.timer_cache_queue = Array.New()
|
|
LateUpdateBeat:Add(TimerQuest.Update,self)
|
|
end
|
|
|
|
function TimerQuest:AddPeriodQuest(onLeftTimeHandler,duration,loop,smooth)
|
|
self.timer_list_index = self.timer_list_index + 1
|
|
local timer = nil
|
|
if Array.GetSize(self.timer_cache_queue) > 0 then
|
|
timer = Array.PopFront(self.timer_cache_queue)
|
|
timer.add_time = self.timer_list_index
|
|
timer.duration = duration
|
|
timer.loop = loop or -1
|
|
timer.func = onLeftTimeHandler
|
|
timer.time = duration
|
|
timer.count = Time.frameCount + 1
|
|
timer.smooth = smooth --smooth会忽略每一帧跟duration的校正差值,保证每次回调周期都是一致的,但是会导致总时间延长
|
|
-- timer.source = PrintFunctionCallPos("AddPeriodQuest")
|
|
else
|
|
timer = {
|
|
add_time = self.timer_list_index,
|
|
duration = duration,
|
|
loop = loop or -1,
|
|
func = onLeftTimeHandler,
|
|
time = duration,
|
|
-- source = PrintFunctionCallPos("AddPeriodQuest"),
|
|
count = Time.frameCount + 1,
|
|
smooth = false,
|
|
}
|
|
end
|
|
if duration <= 0.6 then
|
|
self.timer_list[self.timer_list_index] = timer
|
|
elseif duration <= 2 then
|
|
self.timer_list2[self.timer_list_index] = timer
|
|
else
|
|
self.timer_list3[self.timer_list_index] = timer
|
|
end
|
|
return self.timer_list_index
|
|
end
|
|
|
|
function TimerQuest:AddDelayQuest(onLeftTimeHandler,duration)
|
|
self.timer_list_index = self.timer_list_index + 1
|
|
local timer = nil
|
|
if Array.GetSize(self.timer_cache_queue) > 0 then
|
|
timer = Array.PopFront(self.timer_cache_queue)
|
|
timer.add_time = self.timer_list_index
|
|
timer.duration = duration
|
|
timer.loop = 0
|
|
timer.func = onLeftTimeHandler
|
|
timer.time = duration
|
|
timer.count = Time.frameCount + 1
|
|
timer.smooth = false
|
|
else
|
|
timer = {
|
|
add_time = self.timer_list_index,
|
|
duration = duration,
|
|
loop = 0,
|
|
func = onLeftTimeHandler,
|
|
time = duration,
|
|
count = Time.frameCount + 1,
|
|
smooth = false,
|
|
}
|
|
end
|
|
if duration <= 0.6 then
|
|
self.timer_list[self.timer_list_index] = timer
|
|
elseif duration <= 2 then
|
|
self.timer_list2[self.timer_list_index] = timer
|
|
else
|
|
self.timer_list3[self.timer_list_index] = timer
|
|
end
|
|
return self.timer_list_index
|
|
end
|
|
|
|
|
|
function TimerQuest:CancelQuest(id)
|
|
if id then
|
|
local delete_vo = self.timer_list[id]
|
|
if not delete_vo then
|
|
delete_vo = self.timer_list2[id]
|
|
end
|
|
if not delete_vo then
|
|
delete_vo = self.timer_list3[id]
|
|
end
|
|
if delete_vo then
|
|
if Array.GetSize(self.timer_cache_queue) <= 20 then
|
|
Array.PushBack(self.timer_cache_queue, delete_vo)
|
|
end
|
|
self.timer_list[id] = nil
|
|
self.timer_list2[id] = nil
|
|
self.timer_list3[id] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
function TimerQuest:HandlerTimer(vo, i, frame_count)
|
|
if vo.time <= 0 and frame_count > vo.count then
|
|
|
|
if vo.loop > 0 then
|
|
vo.loop = vo.loop - 1
|
|
if vo.smooth then
|
|
vo.time = vo.duration
|
|
else
|
|
vo.time = vo.time + vo.duration
|
|
end
|
|
end
|
|
|
|
if vo.loop == 0 then
|
|
self:CancelQuest(i)
|
|
elseif vo.loop < 0 then
|
|
if vo.smooth then
|
|
vo.time = vo.duration
|
|
else
|
|
vo.time = vo.time + vo.duration
|
|
end
|
|
end
|
|
vo.func()
|
|
end
|
|
end
|
|
|
|
function TimerQuest:Update()
|
|
-- if G_DEBUG_STOP_ACTION then
|
|
-- return
|
|
-- end
|
|
local delta = Time.deltaTime
|
|
local frame_count = Time.frameCount
|
|
self.update_count = self.update_count + 1
|
|
for i,vo in pairs(self.timer_list) do
|
|
vo.time = vo.time - delta
|
|
self:HandlerTimer(vo, i, frame_count)
|
|
end
|
|
|
|
self.update_delta_time2 = self.update_delta_time2 + delta
|
|
if self.update_count % 9 == 0 then
|
|
for i,vo in pairs(self.timer_list2) do
|
|
vo.time = vo.time - self.update_delta_time2
|
|
self:HandlerTimer(vo, i, frame_count)
|
|
end
|
|
self.update_delta_time2 = 0
|
|
end
|
|
|
|
self.update_delta_time3 = self.update_delta_time3 + delta
|
|
if self.update_count % 29 == 0 then
|
|
for i,vo in pairs(self.timer_list3) do
|
|
vo.time = vo.time - self.update_delta_time3
|
|
self:HandlerTimer(vo, i, frame_count)
|
|
end
|
|
self.update_delta_time3 = 0
|
|
end
|
|
end
|