added timer

This commit is contained in:
Alexey 2025-10-30 15:50:05 +03:00
commit 81a4c4f264

78
timer.lua Normal file
View file

@ -0,0 +1,78 @@
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