# MiniExtend Time
对应源文件: time.lua
。
# 函数介绍
# getTick
获取当前是第几游戏帧。
---@return integer
function getTick() end
# scheduleCall
延时调用。
---@param ticks integer 多少游戏帧后执行回调
---@param func fun():any 执行的回调
---@param ...data any[] 执行回调的带的参数
---@return integer | false 成功时返回延时调用的 ID ,失败返回 false
function scheduleCall(ticks, func, ...) end
# nextTick
下个游戏帧执行回调。
---@param func fun():any 下个游戏帧执行的回调
---@param ...data any[] 执行回调的带的参数
function nextTick(func, ...) end
等价于 scheduleCall(1, func, ...);
。
TIP
如果延时回调中再执行延时,会从下一帧开始倒计时。
# cancelScheduleCall
取消延时调用。
---@param id integer 延时调用的 ID
---@return boolean 调用是否成功
function cancelScheduleCall(id) end
# 类介绍
# Timer
Timer
类,即计时器类,以下简称 Timer
。
注意,计时器运行时间晚于延时调用函数(scheduleCall
)
在延时回调函数中启动计时器会使计时器在那一帧运行。
delay
值会递减,然后判断 delay
并调用 callback
,调用 callback
并重置 delay
。
构造函数:使用 Timer:new()
构造一个 Timer
对象,计时器默认是暂停的。
析构函数:使用 Timer:delete()
使计时器永久停止。
成员变量:
名称 | 类型 | 简介 | 可读 | 可写 |
---|---|---|---|---|
createTime | number | 对象创建时的CPU 时间 | √ | |
tick | integer | 计时器累计运行的游戏帧数 | √ | |
delay | integer | 下次调用 callback 的间隔帧数(≤0时恢复为1) | √ | |
callback | function | nil | delay ≤0时的回调 | √ |
执行回调时传递两个参数:self
(计时器对象) 和 tick
(当前游戏帧数)。
成员函数:
---启动计时器。
---@return boolean 是否成功(调用前是否暂停)
function Timer:start() end
---暂停计时器。
---@return boolean 是否成功(调用前是否启动)
function Timer:pause() end
---获取计时器是否启动。
---@return boolean 计时器是否启动
function Timer:isRunning() end
# 代码示例
# 背景
定义 tick
表示当前游戏帧, i
的值为 2 。
从第一帧开始,每隔两帧执行以下操作:
- 在日志输出当前帧,以及
Fibonacci[i]
的值。 - 将
i
的值加 1 。
i
= 50 后,停止输出。
Fibonacci
表示斐波那契数列,以下简称 fib
,它的定义如下:
fib[0] = 0
fib[1] = 1
fib[i] = fib[i-1] + fib[i-2] ( i ≥ 2 , i ∈ N* )
# 分析
首先需要知道递推求 fib[1...n]
的方法:
定义
fibs[0...n]
,满足fibs[i]
=fib[i]
。
令fibs[0]
=fib[0]
=0
,fib[1]
=fib[1]
=1
,该步骤符合fibs
的性质。
令k
从2
到n
进行如下运算:
- 令fibs[k]
=fibs[k-1]
+fibs[k-2]
- 该步骤也符合fibs
的性质fibs
即为所求。
实际上并不是真的需要 fibs
数组,因为计算 fibs[k]
只需要 fibs[k-1]
和 fibs[k-2]
的值,所以只需要存储这三个变量即可计算。
使用 MiniExtend Time 来完成异步输出,使用 nextTick()
函数实现"从第一帧开始" 。
使用 Timer
计时器对象,通过设置其 delay
值为 2 实现"每隔两帧" 。
i >= 50
时调用 Timer:pause()
来实现"停止循环"。
# 代码
Env.__init__()
timer = Timer:new()
-- fib1 表示 fib[i-2] , fib2 表示 fib[i-1]
-- fib[0] = 0, fib[1] = 1
local i, fib1, fib2 = 2, 0, 1
-- 另一种方法:
-- timer.calback = function(self, tick)
function timer:callback(tick)
-- 回调时 delay 已被默认地设为 1 ,因此需要重新设置 delay
self.delay = 2
-- fib3 表示 Fibonacci[i]
local fib3 = fib1 + fib2
local tickInfo, fibInfo = "tick "..tostring(tick)
local fibInfo = "fib["..tostring(i).."] = "..tostring(fib3)
Log.logtag("fib", tickInfo, fibInfo)
if i >= 50 then
timer:pause()
else
-- 为新的 fib 计算准备
i, fib1, fib2 = i+1, fib2, fib3
end
end
-- 另一种方法:
-- scheduleCall(1, function()
nextTick(function()
-- 计时器运行晚于 nextTick
-- 在这个 nextTick 回调后的那一帧 timer 就会开始运行
timer:start()
end)
部分输出:
[...][fib] tick 1 fib[2] = 1
[...][fib] tick 3 fib[3] = 2
[...][fib] tick 5 fib[4] = 31
[...][fib] tick 7 fib[5] = 5
[...][fib] tick 9 fib[6] = 8
[...][fib] tick 11 fib[7] = 13
[...][fib] tick 13 fib[8] = 21
[...][fib] tick 15 fib[9] = 34
[...][fib] tick 17 fib[10] = 55
[...][fib] tick 87 fib[45] = 1134903170
[...][fib] tick 89 fib[46] = 1836311903
[...][fib] tick 91 fib[47] = 2971215073
[...][fib] tick 93 fib[48] = 4807526976
[...][fib] tick 95 fib[49] = 7778742049
[...][fib] tick 97 fib[50] = 12586269025
← 日志管理 Log 对象管理 Object →