延迟与定时器问题
如何使用定时器?
--需要延迟时间/帧时,使用TimerManager时间管理类的函数--以TimerManager:AddTimer为例--TimerManager:AddTimer(delay,callback,args)--AddTimer只调用一次,第一个参数是延迟秒数,第二个参数是延时到达后调用此回调函数,第三个参数是可变参数,这些参数会一起传递到回调函--例如,1秒后令数字加1,并展示在控件上local client_number=1TimerManager:AddTimer(1,function () client_number=client_number+1 UI:SetText({client_timer_button_text},tostring(client_number)) --将数字转为字符串,使用UI:SetText函数展示结果。预期为2。end)TimerManager中延迟的最小值是多少?
解答: 最小值为 0.01 秒。
如何在循环中增加延迟?
解答:
我们举一个例子。需求是让一组元件,依次间隔一定时间移动。
在元梦扣叮中,可以按照下图这样的思路实现:
但是在编程元件中,如果直接在循环中添加定时器,运行效果并不符合预期。我们会发现,数据组中的元件,看起来一起移动了。
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) endend)