Source code for ggame.timer

from ggame.mathapp import MathApp, _MathDynamic


[docs]class Timer(_MathDynamic): def __init__(self): super().__init__() self.once = [] self.callbacks = {} self.reset() self.step() self._start = self._reset #first time self.next = None MathApp._addDynamic(self) # always dynamically defined def reset(self): self._reset = MathApp.time def step(self): nexttimers = [] calllist = [] self.time = MathApp.time - self._reset while self.once and self.once[0][0] <= MathApp.time: tickinfo = self.once.pop(0) if tickinfo[1]: # periodic? nexttimers.append((tickinfo[1], self.callbacks[tickinfo][0])) # delay, callback calllist.append(self.callbacks[tickinfo].pop(0)) # remove callback and queue it if not self.callbacks[tickinfo]: # if the callback list is empty del self.callbacks[tickinfo] # remove the dictionary entry altogether for tickadd in nexttimers: self.callAfter(tickadd[0], tickadd[1], True) # keep it going for call in calllist: call(self) def callAfter(self, delay, callback, periodic=False): key = (MathApp.time + delay, delay if periodic else 0) self.once.append(key) callbacklist = self.callbacks.get(key, []) callbacklist.append(callback) self.callbacks[key] = callbacklist self.once.sort() def callAt(self, time, callback): self.callAfter(time-self.time, callback) def callEvery(self, period, callback): self.callAfter(period, callback, True) def __call__(self): return self.time