在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 line
3.6 KiB

4 年之前
  1. CreateClass("UniTimerClass")
  2. CreateClass("UniEventClass")
  3. function NewUniTimerClass(callback, msec, ...)
  4. local timer = {
  5. nextmsec=unitimer.now,
  6. callback = callback,
  7. tick = msec,
  8. params = arg,
  9. }
  10. UniTimerClass:New(timer)
  11. return timer
  12. end
  13. function NewUniTimerRandomClass(callback, msec, ...)
  14. local timer = {
  15. nextmsec=unitimer.now+math.random(msec/2,msec),
  16. callback = callback,
  17. tick = msec,
  18. params = arg,
  19. }
  20. UniTimerClass:New(timer)
  21. return timer
  22. end
  23. function NewUniEventClass(callback, msec,maxtimes, ...)
  24. local event = {
  25. nextmsec=unitimer.now+msec,
  26. callback = callback,
  27. tick = msec,
  28. maxtimes = maxtimes,
  29. params = arg,
  30. }
  31. UniEventClass:New(event)
  32. return event
  33. end
  34. function UniTimerClass:GetId()
  35. return self.tick
  36. end
  37. function UniTimerClass:GetName()
  38. return self.tick
  39. end
  40. function UniTimerClass:Stop()
  41. self.stop = true
  42. unitimer.removetimer(self)
  43. end
  44. function UniTimerClass:Check(now,force)
  45. if self.nextmsec <= now or force then
  46. --unilight.error("UniEventClass:"..unpack(self.params))
  47. self.nextmsec = now + self.tick --如果callback脚本报错,会悲剧,WHJ,似乎没人用,先提前试试
  48. self.callback(unpack(self.params))
  49. return true
  50. end
  51. --duaration=0
  52. --first=true
  53. --pause=false
  54. --stop=false
  55. return false
  56. end
  57. function UniEventClass:GetId()
  58. return self.tick
  59. end
  60. function UniEventClass:GetName()
  61. return self.maxtimes
  62. end
  63. function UniEventClass:Check(now,force)
  64. --if (self.nextmsec <= now or force) and self.tick > 0 then
  65. if (self.maxtimes > 0 and self.nextmsec <= now) or force then
  66. self.nextmsec = now + self.tick --如果callback脚本报错,会悲剧,WHJ,似乎没人用,先提前试试
  67. self.maxtimes = self.maxtimes - 1 --计数可以提前,时间不能提前,有可能逻辑里要用时间,提前的目的是防止Check报错后就悲剧
  68. self.callback(unpack(self.params))
  69. return true
  70. end
  71. return false
  72. end
  73. function UniEventClass:Stop()
  74. unitimer.removeevent(self)
  75. end
  76. unitimer={
  77. timermap={},
  78. eventmap={},
  79. }
  80. function unitimer.init(msec) --最小精度的定时器
  81. unitimer.now = go.time.Msec()
  82. if unitimer.ticktimer ~= nil then
  83. unilight.error("unitimer.init已经初始化过了:"..unitimer.tickmsec)
  84. return false
  85. end
  86. unitimer.tickmsec = msec --保存最小精度
  87. unitimer.ticktimer = unilight.addtimermsec("unitimer.loop", msec)
  88. return true
  89. end
  90. function unitimer.loop()
  91. local timer = unitimer
  92. timer.now = go.time.Msec()
  93. for k,v in pairs(timer.timermap) do
  94. if v:Check(timer.now) == true then
  95. if v.stop == true then
  96. timer.removetimer(v)
  97. end
  98. end
  99. end
  100. for k,v in pairs(timer.eventmap) do
  101. if v:Check(timer.now) == true then
  102. if v.maxtimes <= 0 then
  103. --v:Debug("事件结束")
  104. v:Stop()
  105. end
  106. end
  107. end
  108. end
  109. function unitimer.addtimermsec(callback, msec, ...)
  110. local timer = NewUniTimerClass(callback, msec, ...)
  111. --timer:Debug("unitimer.addtimermsec:")
  112. unitimer.timermap[timer]=timer
  113. return timer
  114. end
  115. function unitimer.addtimer(callback, msec, ...)
  116. return unitimer.addtimermsec(callback, msec*1000, ...)
  117. end
  118. function unitimer.removetimer(timer)
  119. --timer:Debug("unitimer.removetimer:")
  120. unitimer.timermap[timer] = nil
  121. end
  122. function unitimer.addevent(callback, msec,maxtimes, ...)
  123. return unitimer.addeventmsec(callback, msec*1000,maxtimes, ...)
  124. end
  125. function unitimer.addeventmsec(callback, msec,maxtimes, ...)
  126. maxtime = maxtimes or 1
  127. local event = NewUniEventClass(callback, msec,maxtimes, ...)
  128. --event:Debug("设置事件:"..msec)
  129. unitimer.eventmap[event]=event
  130. return event
  131. end
  132. function unitimer.removeevent(event)
  133. unitimer.eventmap[event] = nil
  134. end