跳转到内容

延迟与定时器问题

如何使用定时器?

--需要延迟时间/帧时,使用TimerManager时间管理类的函数
--以TimerManager:AddTimer为例
--TimerManager:AddTimer(delay,callback,args)--AddTimer只调用一次,第一个参数是延迟秒数,第二个参数是延时到达后调用此回调函数,第三个参数是可变参数,这些参数会一起传递到回调函
--例如,1秒后令数字加1,并展示在控件上
local client_number=1
TimerManager:AddTimer(1,function ()
client_number=client_number+1
UI:SetText({client_timer_button_text},tostring(client_number)) --将数字转为字符串,使用UI:SetText函数展示结果。预期为2。
end)

TimerManager中延迟的最小值是多少?

解答: 最小值为 0.01 秒。

如何在循环中增加延迟?

解答:

我们举一个例子。需求是让一组元件,依次间隔一定时间移动。

在元梦扣叮中,可以按照下图这样的思路实现:

image1

但是在编程元件中,如果直接在循环中添加定时器,运行效果并不符合预期。我们会发现,数据组中的元件,看起来一起移动了。

for key, value in pairs(spawn_list) do
Element:MoveTo(value,Element:GetPosition(value)+Engine.Vector(0,200,0),1,Element.CURVE.linear)
TimerManager:AddTimer(1,function () end)
end

这是因为,在Lua脚本中,TimerManager:AddTimer函数运行后,就立即进行下一次循环的逻辑了。

为了处理这种需求,可以参考下面两种思路。

方法1,使用递归的思路。

--示例代码
local nextMove=1 --元件表的索引
GameServer:MoveTo(1)
function GameServer:MoveTo(number)
--移动元件
Element:MoveTo(spawn_list[number],Element:GetPosition(spawn_list[number])+Engine.Vector(0,200,0),1,Element.CURVE.linear)
--添加定时器
TimerManager:AddTimer(1,function ()
--设置下一个要移动的元件,在表中的索引(+1)
nextMove=nextMove+1
--如果索引不超过表长度
if nextMove<=#spawn_list then
self:MoveTo(nextMove) --递归调用MoveTo函数
else
print("move end")
end
end)
end

方法2,使用循环定时器

--示例代码
--首先建立循环定时器
timerId=TimerManager:AddLoopTimer(1,function ()
--移动元件
Element:MoveTo(spawn_list[nextMove],Element:GetPosition(spawn_list[nextMove])+Engine.Vector(0,200,0),1,Element.CURVE.linear)
--设置下一个要移动的元件,在表中的索引(+1)
nextMove=nextMove+1
--当索引大于表长度时
if nextMove>#spawn_list then
print("move end")
--移除循环定时器
TimerManager:RemoveTimer(timerId)
end
end)