对应源文件: time.lua
getTick() 函数scheduleCall(ticks, func, ...) 函数ticks 游戏帧后以 ... 为参数调用函数 func 。 func 可能导致程序阻塞。 ticks:{integer} 会被设置为 math.max(math.floor(ticks), 1) 来修正不合法的数值 func:{function} 延时调用的函数 ...:{all} 调用 func 时传递的实参 {integer | boolean} 成功时返回延时调用的 id (用于取消监听),否则返回 false nextTick(func, ...) 函数... 为参数调用函数 func 。 scheduleCall(1, func, ...); 。 注: 如果在延时回调函数中再调用 scheduleCall() 或 nextTick() 来延时执行函数,则从下一帧开始倒计时。
cancelScheduleCall(id) 函数id:{integer} 延时调用的 id ,由 scheduleCall() 或 nextTick() 返回 {boolean} 如果正确地取消了一个函数调用,返回 true ,否则返回 false Timer 类Timer 类即计时器类,以下简称 Timer 。
注意,计时器运行时期晚于延时调用的函数(scheduleCall())。
在延时回调函数中启动计时器会使计时器在那一帧运行。
同样, delay 值仍会递减,然后判断 delay 并调用 callback 。
,仍然正常调用 callback 并重置 delay 。
使用 Timer:new() 来构造一个计时器和相应的 Timer 对象,计时器默认是暂停的。
使用 Timer:delete() 来删除计时器,这不会删除对象本身,仅仅使计时器失去计时功能。
createTime:{float} 表示对象创建时的 CPU 时间。 tick:{integer} 表示对象创建以来计时器运行的游戏帧数。 delay:{integer} 下一次调用 callback 的间隔帧数,计时器运行期间每帧减 1 ,降为 0 时恢复为 1 。delay 设为 0 然后 delay 变为 -1 ,仍然正常的恢复 delay 为 1 然后调用 callback 。 callback:{function | nil} 当 delay 降为 0 时,调用该函数。 回调时传递两个参数:
self和tick。self表示计时器对象。tick表示当前游戏帧。
start(): 启动计时器,如果计时器之前是暂停的返回 true ,否则返回 false 。 pause(): 暂停计时器,如果计时器之前是启动的返回 true ,否则返回 false 。 isRunning(): 返回计时器是否启动。 首先定义 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)
部分输出如下:
