Browse Source

added FrameDelayedCallback, DelayedCallback->DelayedFunctor

Darren Ranalli 19 years ago
parent
commit
ae56529276
1 changed files with 39 additions and 8 deletions
  1. 39 8
      direct/src/showbase/PythonUtil.py

+ 39 - 8
direct/src/showbase/PythonUtil.py

@@ -2258,17 +2258,18 @@ class DelayedCall:
         del self._func
         del self._func
         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
         self._name = name
         # FunctionInterval requires __name__
         # FunctionInterval requires __name__
         self.__name__ = self._name
         self.__name__ = self._name
         self._delay = delay
         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._name
         del self._delay
         del self._delay
         del self._args
         del self._args
@@ -2279,7 +2280,37 @@ class DelayedCallback:
     def __call__(self, *args, **kwArgs):
     def __call__(self, *args, **kwArgs):
         self._args = args
         self._args = args
         self._kwArgs = kwArgs
         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__
 import __builtin__
 __builtin__.Functor = Functor
 __builtin__.Functor = Functor