mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
generalize context number-based callback with AI
This commit is contained in:
parent
fc34f9aeb8
commit
9a79b2c7b2
@ -49,6 +49,10 @@ class DistributedObject(PandaObject):
|
||||
# calls up the chain for disable() and generate().
|
||||
self.activeState = ESNew
|
||||
|
||||
# These are used by getCallbackContext() and doCallbackContext().
|
||||
self.__nextContext = 0
|
||||
self.__callbacks = {}
|
||||
|
||||
return None
|
||||
|
||||
#def __del__(self):
|
||||
@ -142,6 +146,7 @@ class DistributedObject(PandaObject):
|
||||
Inheritors should redefine this to take appropriate action on disable
|
||||
"""
|
||||
self.activeState = ESDisabled
|
||||
self.__callbacks = {}
|
||||
|
||||
def isDisabled(self):
|
||||
"""isDisabled(self)
|
||||
@ -217,3 +222,43 @@ class DistributedObject(PandaObject):
|
||||
|
||||
|
||||
|
||||
def getCallbackContext(self, callback, extraArgs = []):
|
||||
# Some objects implement a back-and-forth handshake operation
|
||||
# with the AI via an arbitrary context number. This method
|
||||
# (coupled with doCallbackContext(), below) maps a Python
|
||||
# callback onto that context number so that client code may
|
||||
# easily call the method and wait for a callback, rather than
|
||||
# having to negotiate context numbers.
|
||||
|
||||
# This method generates a new context number and stores the
|
||||
# callback so that it may later be called when the response is
|
||||
# returned.
|
||||
|
||||
# This is intended to be called within derivations of
|
||||
# DistributedObject, not directly by other objects.
|
||||
|
||||
context = self.__nextContext
|
||||
self.__callbacks[context] = (callback, extraArgs)
|
||||
# We assume the context number is passed as a uint16.
|
||||
self.__nextContext = (self.__nextContext + 1) & 0xffff
|
||||
|
||||
return context
|
||||
|
||||
def doCallbackContext(self, context, args):
|
||||
# This is called after the AI has responded to the message
|
||||
# sent via getCallbackContext(), above. The context number is
|
||||
# looked up in the table and the associated callback is
|
||||
# issued.
|
||||
|
||||
# This is intended to be called within derivations of
|
||||
# DistributedObject, not directly by other objects.
|
||||
|
||||
tuple = self.__callbacks.get(context)
|
||||
if tuple:
|
||||
callback, extraArgs = tuple
|
||||
completeArgs = args + extraArgs
|
||||
callback(*completeArgs)
|
||||
del self.__callbacks[context]
|
||||
else:
|
||||
self.notify.warning("Got unexpected context from AI: %s" % (context))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user