184 lines
3.8 KiB
Lua
184 lines
3.8 KiB
Lua
|
--------------------------------------------------------------------------------
|
|||
|
-- Copyright (c) 2015 , 蒙占志(topameng) topameng@gmail.com
|
|||
|
-- All rights reserved.
|
|||
|
-- Use, modification and distribution are subject to the "MIT License"
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
local setmetatable = setmetatable
|
|||
|
local UpdateBeat = UpdateBeat
|
|||
|
local CoUpdateBeat = CoUpdateBeat
|
|||
|
local Time = Time
|
|||
|
|
|||
|
Timer = {}
|
|||
|
|
|||
|
local Timer = Timer
|
|||
|
local mt = {__index = Timer}
|
|||
|
|
|||
|
--unscaled false 采用deltaTime计时,true 采用 unscaledDeltaTime计时
|
|||
|
function Timer.New(func, duration, loop, unscaled)
|
|||
|
unscaled = unscaled or false and true
|
|||
|
loop = loop or 1
|
|||
|
return setmetatable({func = func, duration = duration, time = duration, loop = loop, unscaled = unscaled, running = false}, mt)
|
|||
|
end
|
|||
|
|
|||
|
function Timer:Start()
|
|||
|
self.running = true
|
|||
|
|
|||
|
if not self.handle then
|
|||
|
self.handle = UpdateBeat:CreateListener(self.Update, self)
|
|||
|
end
|
|||
|
|
|||
|
UpdateBeat:AddListener(self.handle)
|
|||
|
end
|
|||
|
|
|||
|
function Timer:Reset(func, duration, loop, unscaled)
|
|||
|
self.duration = duration
|
|||
|
self.loop = loop or 1
|
|||
|
self.unscaled = unscaled
|
|||
|
self.func = func
|
|||
|
self.time = duration
|
|||
|
end
|
|||
|
|
|||
|
function Timer:Stop()
|
|||
|
self.running = false
|
|||
|
|
|||
|
if self.handle then
|
|||
|
UpdateBeat:RemoveListener(self.handle)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function Timer:Update()
|
|||
|
if not self.running then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local delta = self.unscaled and Time.unscaledDeltaTime or Time.deltaTime
|
|||
|
self.time = self.time - delta
|
|||
|
|
|||
|
if self.time <= 0 then
|
|||
|
self.func()
|
|||
|
|
|||
|
if self.loop > 0 then
|
|||
|
self.loop = self.loop - 1
|
|||
|
self.time = self.time + self.duration
|
|||
|
end
|
|||
|
|
|||
|
if self.loop == 0 then
|
|||
|
self:Stop()
|
|||
|
elseif self.loop < 0 then
|
|||
|
self.time = self.time + self.duration
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--给协同使用的帧计数timer
|
|||
|
FrameTimer = {}
|
|||
|
|
|||
|
local FrameTimer = FrameTimer
|
|||
|
local mt2 = {__index = FrameTimer}
|
|||
|
|
|||
|
function FrameTimer.New(func, count, loop)
|
|||
|
local c = Time.frameCount + count
|
|||
|
loop = loop or 1
|
|||
|
return setmetatable({func = func, loop = loop, duration = count, count = c, running = false}, mt2)
|
|||
|
end
|
|||
|
|
|||
|
function FrameTimer:Reset(func, count, loop)
|
|||
|
self.func = func
|
|||
|
self.duration = count
|
|||
|
self.loop = loop
|
|||
|
self.count = Time.frameCount + count
|
|||
|
end
|
|||
|
|
|||
|
function FrameTimer:Start()
|
|||
|
if not self.handle then
|
|||
|
self.handle = CoUpdateBeat:CreateListener(self.Update, self)
|
|||
|
end
|
|||
|
|
|||
|
CoUpdateBeat:AddListener(self.handle)
|
|||
|
self.running = true
|
|||
|
end
|
|||
|
|
|||
|
function FrameTimer:Stop()
|
|||
|
self.running = false
|
|||
|
|
|||
|
if self.handle then
|
|||
|
CoUpdateBeat:RemoveListener(self.handle)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function FrameTimer:Update()
|
|||
|
if not self.running then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
if Time.frameCount >= self.count then
|
|||
|
self.func()
|
|||
|
|
|||
|
if self.loop > 0 then
|
|||
|
self.loop = self.loop - 1
|
|||
|
end
|
|||
|
|
|||
|
if self.loop == 0 then
|
|||
|
self:Stop()
|
|||
|
else
|
|||
|
self.count = Time.frameCount + self.duration
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
CoTimer = {}
|
|||
|
|
|||
|
local CoTimer = CoTimer
|
|||
|
local mt3 = {__index = CoTimer}
|
|||
|
|
|||
|
function CoTimer.New(func, duration, loop)
|
|||
|
loop = loop or 1
|
|||
|
return setmetatable({duration = duration, loop = loop, func = func, time = duration, running = false}, mt3)
|
|||
|
end
|
|||
|
|
|||
|
function CoTimer:Start()
|
|||
|
if not self.handle then
|
|||
|
self.handle = CoUpdateBeat:CreateListener(self.Update, self)
|
|||
|
end
|
|||
|
|
|||
|
self.running = true
|
|||
|
CoUpdateBeat:AddListener(self.handle)
|
|||
|
end
|
|||
|
|
|||
|
function CoTimer:Reset(func, duration, loop)
|
|||
|
self.duration = duration
|
|||
|
self.loop = loop or 1
|
|||
|
self.func = func
|
|||
|
self.time = duration
|
|||
|
end
|
|||
|
|
|||
|
function CoTimer:Stop()
|
|||
|
self.running = false
|
|||
|
|
|||
|
if self.handle then
|
|||
|
CoUpdateBeat:RemoveListener(self.handle)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function CoTimer:Update()
|
|||
|
if not self.running then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
if self.time <= 0 then
|
|||
|
self.func()
|
|||
|
|
|||
|
if self.loop > 0 then
|
|||
|
self.loop = self.loop - 1
|
|||
|
self.time = self.time + self.duration
|
|||
|
end
|
|||
|
|
|||
|
if self.loop == 0 then
|
|||
|
self:Stop()
|
|||
|
elseif self.loop < 0 then
|
|||
|
self.time = self.time + self.duration
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
self.time = self.time - Time.deltaTime
|
|||
|
end
|