diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index 508808aad4..9081da1b95 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -2258,17 +2258,18 @@ class DelayedCall: del self._func func() -class DelayedCallback: - """ waits for this object to be called, then calls your callback after a delay """ - def __init__(self, callback, name=None, delay=None): - self._callback = callback +class DelayedFunctor: + """ Waits for this object to be called, then calls supplied functor after a delay. + Effectively inserts a time delay between the caller and the functor. """ + def __init__(self, functor, name=None, delay=None): + self._functor = functor self._name = name # FunctionInterval requires __name__ self.__name__ = self._name self._delay = delay - def _doCallback(self): - cb = Functor(self._callback, *self._args, **self._kwArgs) - del self._callback + def _callFunctor(self): + cb = Functor(self._functor, *self._args, **self._kwArgs) + del self._functor del self._name del self._delay del self._args @@ -2279,7 +2280,37 @@ class DelayedCallback: def __call__(self, *args, **kwArgs): self._args = args self._kwArgs = kwArgs - self._delayedCall = DelayedCall(self._doCallback, self._name, self._delay) + self._delayedCall = DelayedCall(self._callFunctor, self._name, self._delay) + +class FrameDelayedCallback: + """ waits N frames and then calls a callback """ + def __init__(self, frames, callback, cancelFunc=None): + # checkFunc is optional; called every frame, if returns True, FrameDelay is cancelled + # and callback is not called + self._frames = frames + self._callback = callback + self._cancelFunc = cancelFunc + self._taskName = uniqueName(self.__class__.__name__) + self._startTask() + def destroy(self): + self._stopTask() + def finish(self): + self._callback() + self.destroy() + def _startTask(self): + taskMgr.add(self._frameTask, self._taskName) + self._counter = 0 + def _stopTask(self): + taskMgr.remove(self._taskName) + def _frameTask(self, task): + if self._cancelFunc(): + self.destroy() + return task.done + self._counter += 1 + if self._counter >= self._frames: + self.finish() + return task.done + return task.cont import __builtin__ __builtin__.Functor = Functor