在go中使用lua示例, 基于gopher-lua!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

137 regels
3.6 KiB

CreateClass("UniTimerClass")
CreateClass("UniEventClass")
function NewUniTimerClass(callback, msec, ...)
local timer = {
nextmsec=unitimer.now,
callback = callback,
tick = msec,
params = arg,
}
UniTimerClass:New(timer)
return timer
end
function NewUniTimerRandomClass(callback, msec, ...)
local timer = {
nextmsec=unitimer.now+math.random(msec/2,msec),
callback = callback,
tick = msec,
params = arg,
}
UniTimerClass:New(timer)
return timer
end
function NewUniEventClass(callback, msec,maxtimes, ...)
local event = {
nextmsec=unitimer.now+msec,
callback = callback,
tick = msec,
maxtimes = maxtimes,
params = arg,
}
UniEventClass:New(event)
return event
end
function UniTimerClass:GetId()
return self.tick
end
function UniTimerClass:GetName()
return self.tick
end
function UniTimerClass:Stop()
self.stop = true
unitimer.removetimer(self)
end
function UniTimerClass:Check(now,force)
if self.nextmsec <= now or force then
--unilight.error("UniEventClass:"..unpack(self.params))
self.nextmsec = now + self.tick --如果callback脚本报错,会悲剧,WHJ,似乎没人用,先提前试试
self.callback(unpack(self.params))
return true
end
--duaration=0
--first=true
--pause=false
--stop=false
return false
end
function UniEventClass:GetId()
return self.tick
end
function UniEventClass:GetName()
return self.maxtimes
end
function UniEventClass:Check(now,force)
--if (self.nextmsec <= now or force) and self.tick > 0 then
if (self.maxtimes > 0 and self.nextmsec <= now) or force then
self.nextmsec = now + self.tick --如果callback脚本报错,会悲剧,WHJ,似乎没人用,先提前试试
self.maxtimes = self.maxtimes - 1 --计数可以提前,时间不能提前,有可能逻辑里要用时间,提前的目的是防止Check报错后就悲剧
self.callback(unpack(self.params))
return true
end
return false
end
function UniEventClass:Stop()
unitimer.removeevent(self)
end
unitimer={
timermap={},
eventmap={},
}
function unitimer.init(msec) --最小精度的定时器
unitimer.now = go.time.Msec()
if unitimer.ticktimer ~= nil then
unilight.error("unitimer.init已经初始化过了:"..unitimer.tickmsec)
return false
end
unitimer.tickmsec = msec --保存最小精度
unitimer.ticktimer = unilight.addtimermsec("unitimer.loop", msec)
return true
end
function unitimer.loop()
local timer = unitimer
timer.now = go.time.Msec()
for k,v in pairs(timer.timermap) do
if v:Check(timer.now) == true then
if v.stop == true then
timer.removetimer(v)
end
end
end
for k,v in pairs(timer.eventmap) do
if v:Check(timer.now) == true then
if v.maxtimes <= 0 then
--v:Debug("事件结束")
v:Stop()
end
end
end
end
function unitimer.addtimermsec(callback, msec, ...)
local timer = NewUniTimerClass(callback, msec, ...)
--timer:Debug("unitimer.addtimermsec:")
unitimer.timermap[timer]=timer
return timer
end
function unitimer.addtimer(callback, msec, ...)
return unitimer.addtimermsec(callback, msec*1000, ...)
end
function unitimer.removetimer(timer)
--timer:Debug("unitimer.removetimer:")
unitimer.timermap[timer] = nil
end
function unitimer.addevent(callback, msec,maxtimes, ...)
return unitimer.addeventmsec(callback, msec*1000,maxtimes, ...)
end
function unitimer.addeventmsec(callback, msec,maxtimes, ...)
maxtime = maxtimes or 1
local event = NewUniEventClass(callback, msec,maxtimes, ...)
--event:Debug("设置事件:"..msec)
unitimer.eventmap[event]=event
return event
end
function unitimer.removeevent(event)
unitimer.eventmap[event] = nil
end