87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
"""Contains the Timer class."""
|
|
|
|
__all__ = ['Timer']
|
|
|
|
from panda3d.core import ClockObject
|
|
|
|
from . import Task
|
|
from .TaskManagerGlobal import taskMgr
|
|
|
|
|
|
class Timer:
|
|
id = 0
|
|
|
|
def __init__(self, name=None):
|
|
self.finalT = 0.0
|
|
self.currT = 0.0
|
|
if name is None:
|
|
name = 'default-timer-%d' % Timer.id
|
|
Timer.id += 1
|
|
self.name = name
|
|
self.started = 0
|
|
self.callback = None
|
|
|
|
def start(self, t, name):
|
|
if self.started:
|
|
self.stop()
|
|
self.callback = None
|
|
self.finalT = t
|
|
self.name = name
|
|
self.startT = ClockObject.getGlobalClock().getFrameTime()
|
|
self.currT = 0.0
|
|
taskMgr.add(self.__timerTask, self.name + '-run')
|
|
self.started = 1
|
|
|
|
def startCallback(self, t, callback):
|
|
if self.started:
|
|
self.stop()
|
|
self.callback = callback
|
|
self.finalT = t
|
|
self.startT = ClockObject.getGlobalClock().getFrameTime()
|
|
self.currT = 0.0
|
|
taskMgr.add(self.__timerTask, self.name + '-run')
|
|
self.started = 1
|
|
|
|
def stop(self):
|
|
if not self.started:
|
|
return 0.0
|
|
taskMgr.remove(self.name + '-run')
|
|
self.started = 0
|
|
return self.currT
|
|
|
|
def resume(self):
|
|
assert self.currT <= self.finalT
|
|
assert self.started == 0
|
|
self.start(self.finalT - self.currT, self.name)
|
|
|
|
def restart(self):
|
|
if self.callback is not None:
|
|
self.startCallback(self.finalT, self.callback)
|
|
else:
|
|
self.start(self.finalT, self.name)
|
|
|
|
def isStarted(self):
|
|
return self.started
|
|
|
|
def addT(self, t):
|
|
self.finalT = self.finalT + t
|
|
|
|
def setT(self, t):
|
|
self.finalT = t
|
|
|
|
def getT(self):
|
|
return self.finalT - self.currT
|
|
|
|
def __timerTask(self, task):
|
|
t = ClockObject.getGlobalClock().getFrameTime()
|
|
te = t - self.startT
|
|
self.currT = te
|
|
if te >= self.finalT:
|
|
if self.callback is not None:
|
|
self.callback()
|
|
else:
|
|
from direct.showbase.MessengerGlobal import messenger
|
|
messenger.send(self.name)
|
|
return Task.done
|
|
return Task.cont
|