MiniExtend Time

对应源文件: time.lua


getTick() 函数


scheduleCall(ticks, func, ...) 函数


nextTick(func, ...) 函数

注: 如果在延时回调函数中再调用 scheduleCall()nextTick() 来延时执行函数,则从下一帧开始倒计时。


cancelScheduleCall(id) 函数


Timer

Timer 类即计时器类,以下简称 Timer

注意,计时器运行时期晚于延时调用的函数(scheduleCall())。
在延时回调函数中启动计时器会使计时器在那一帧运行。
同样, delay 值仍会递减,然后判断 delay 并调用 callback
,仍然正常调用 callback 并重置 delay

构造函数

使用 Timer:new() 来构造一个计时器和相应的 Timer 对象,计时器默认是暂停的。

析构函数

使用 Timer:delete() 来删除计时器,这不会删除对象本身,仅仅使计时器失去计时功能。

属性

方法


综合实例

情形

首先定义 tick 表示当前游戏帧, i 的值为 2 。
从第一帧开始,每隔两帧执行以下操作:

i=50 以后,停止输出。
Fibonacci 表示斐波那契数列,以下简称 fib ,它的定义如下:

分析

首先需要知道快速计算 fib[1~n] 的方法:

定义 fibs[0~n] ,满足 fibs[i] = fib[i]
fibs[0] = fib[0] = 0, fib[1] = fib[1] = 1 ,该步骤符合 fibs 的性质。
k2n 进行如下运算:

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)

部分输出如下:
上部输出 下部输出