78 lines
1.7 KiB
Lua
78 lines
1.7 KiB
Lua
local function defaultTimeout() end
|
|
|
|
---@class Timer
|
|
---@field duration number
|
|
---@field time number
|
|
---@field oneShot boolean
|
|
---@field timeout function
|
|
---@field data table
|
|
---@field paused boolean
|
|
Timer = {
|
|
duration = 1,
|
|
time = 1,
|
|
oneShot = false,
|
|
timeout = defaultTimeout,
|
|
data = {},
|
|
paused = true
|
|
}
|
|
|
|
---@param duration number|nil
|
|
---@param oneShot boolean|nil
|
|
---@param timeout function|nil
|
|
---@param data table|nil
|
|
---@return Timer
|
|
function Timer:new( duration, oneShot, timeout, data )
|
|
local timer = {
|
|
duration = duration or self.duration,
|
|
time = duration or self.duration,
|
|
oneShot = oneShot or self.oneShot,
|
|
timeout = timeout or self.timeout,
|
|
data = data or self.data,
|
|
paused = self.paused,
|
|
}
|
|
setmetatable( timer, { __index = self } )
|
|
|
|
return timer
|
|
end
|
|
|
|
---@param dt number
|
|
function Timer:tick( dt )
|
|
if self.paused then
|
|
return
|
|
end
|
|
|
|
self.time = self.time - dt
|
|
|
|
if self.time <= 0 then
|
|
self.timeout( self.data )
|
|
|
|
if self.oneShot then
|
|
self.paused = true
|
|
self.time = 0
|
|
else
|
|
self.time = self.duration + self.time
|
|
end
|
|
end
|
|
end
|
|
|
|
---@param duration number|nil
|
|
function Timer:start( duration )
|
|
self.paused = false
|
|
if duration ~= nil then
|
|
self.duration = duration
|
|
end
|
|
self.time = self.duration
|
|
end
|
|
|
|
---@param emit boolean
|
|
function Timer:stop( emit )
|
|
self.paused = true
|
|
self.time = 0
|
|
if emit then
|
|
self.timeout( self.data )
|
|
end
|
|
end
|
|
|
|
function Timer:elapsed()
|
|
return self.duration - self.time
|
|
end
|