Timer.py 2.2 KB

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