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