这是计时器的代码:
local copyTable = require("Helpers.copyTable")
local timer = {}
timer.max = 0
timer.time = 0
function timer:add(dt)
timer.time = timer.time + dt
end
function timer:reset()
timer.time = 0
end
return copyTable(timer)
复制表函数返回一个新表,其中包含复制表的所有值。
这是使用它的一些基本代码:
ovenTime = require("timer")
ovenTime.add(.5)
print(ovenTime.time)
这给了我 0 的输出。 我原以为它会输出 0.5,因为时间被添加到了 0.5 上。
提前致谢!
最重要的是,如果你用分号声明方法
add()
,那么你应该调用它:ovenTime:add (.5)
,而不是ovenTime.add (.5)
。
还有其他小改进:
timer.lua
:
local copyTable = require 'Helpers.copyTable'
local timer = { max = 0, time = 0 }
function timer:add (dt)
self.time = self.time + dt
end
function timer:reset ()
self.time = 0
end
-- serialisable "decorator":
local function serialisable (tbl)
local meta = getmetatable (tbl) or {}
meta.__tostring = function (tbl)
return tostring (tbl.time)
end
return setmetatable (tbl, meta)
end
return serialisable (copyTable (timer))
以及调用程序:
ovenTime = require 'timer'
ovenTime:add (.5) -- note ':' instead of '.'.
print (ovenTime) -- it will output '0.5', not 'table: 0x...'
还有一些
timer.lua
的进一步简化:
-- serialisable 'decorator':
local function serialisable (tbl)
local meta = getmetatable (tbl) or {}
meta.__tostring = function (tbl)
return tostring (tbl.time)
end
return setmetatable (tbl, meta)
end
return serialisable {
time = 0,
max = 0,
add = function (self, dt)
self.time = self.time + dt
end,
reset = function (self)
self.time = 0
end
}
最后,一个允许多个独立计时器的解决方案,因为这似乎就是你想要的,因为你深度复制了表:
timer.lua
:
-- serialisable 'decorator':
local function serialisable (tbl)
local meta = getmetatable (tbl) or {}
meta.__tostring = function (tbl)
return tostring (tbl.time)
end
return setmetatable (tbl, meta)
end
return function ()
return serialisable {
time = 0,
max = 0,
add = function (self, dt)
self.time = self.time + dt
end,
reset = function (self)
self.time = 0
end
}
end
及其调用者:
local timer = require 'timer'
local ovenTime = timer ()
ovenTime:add (.5)
print (ovenTime)