Timer.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """Contains the Timer class."""
  2. __all__ = ['Timer']
  3. from . import Task
  4. class Timer:
  5. id = 0
  6. def __init__(self, name=None):
  7. self.finalT = 0.0
  8. self.currT = 0.0
  9. if (name == None):
  10. name = 'default-timer-%d' % Timer.id
  11. Timer.id += 1
  12. self.name = name
  13. self.started = 0
  14. self.callback = None
  15. def start(self, t, name):
  16. if (self.started):
  17. self.stop()
  18. self.callback = None
  19. self.finalT = t
  20. self.name = name
  21. self.startT = globalClock.getFrameTime()
  22. self.currT = 0.0
  23. taskMgr.add(self.__timerTask, self.name + '-run')
  24. self.started = 1
  25. def startCallback(self, t, callback):
  26. if (self.started):
  27. self.stop()
  28. self.callback = callback
  29. self.finalT = t
  30. self.startT = globalClock.getFrameTime()
  31. self.currT = 0.0
  32. taskMgr.add(self.__timerTask, self.name + '-run')
  33. self.started = 1
  34. def stop(self):
  35. if (not self.started):
  36. return 0.0
  37. taskMgr.remove(self.name + '-run')
  38. self.started = 0
  39. return self.currT
  40. def resume(self):
  41. assert self.currT <= self.finalT
  42. assert self.started == 0
  43. self.start(self.finalT - self.currT, self.name)
  44. def restart(self):
  45. if (self.callback != None):
  46. self.startCallback(self.finalT, self.callback)
  47. else:
  48. self.start(self.finalT, self.name)
  49. def isStarted(self):
  50. return self.started
  51. def addT(self, t):
  52. self.finalT = self.finalT + t
  53. def setT(self, t):
  54. self.finalT = t
  55. def getT(self):
  56. return (self.finalT - self.currT)
  57. def __timerTask(self, task):
  58. t = globalClock.getFrameTime()
  59. te = t - self.startT
  60. self.currT = te
  61. if (te >= self.finalT):
  62. if (self.callback != None):
  63. self.callback()
  64. else:
  65. messenger.send(self.name)
  66. return Task.done
  67. return Task.cont