mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -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().
|
# calls up the chain for disable() and generate().
|
||||||
self.activeState = ESNew
|
self.activeState = ESNew
|
||||||
|
|
||||||
|
# These are used by getCallbackContext() and doCallbackContext().
|
||||||
|
self.__nextContext = 0
|
||||||
|
self.__callbacks = {}
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
#def __del__(self):
|
#def __del__(self):
|
||||||
@ -142,6 +146,7 @@ class DistributedObject(PandaObject):
|
|||||||
Inheritors should redefine this to take appropriate action on disable
|
Inheritors should redefine this to take appropriate action on disable
|
||||||
"""
|
"""
|
||||||
self.activeState = ESDisabled
|
self.activeState = ESDisabled
|
||||||
|
self.__callbacks = {}
|
||||||
|
|
||||||
def isDisabled(self):
|
def isDisabled(self):
|
||||||
"""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