gameeventkeys.py
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:3k
源码类别:

其他游戏

开发平台:

Python

  1. # gameeventkeys.py
  2. #
  3. # Implements the event key objects, which 
  4. # allows precise registration for events 
  5. # based on specific criteria.
  6. # Author: Matthew Walker
  7. #         mwalker@softhome.net
  8. #
  9. class GameEventKey:
  10.   """
  11.   Event key base class.
  12.   Responsible for providing the equality and hashing
  13.   operators which allow this object and its derived
  14.   classes to be used as dictionary keys. Also 
  15.   responsible for implementing the event registration
  16.   and lookup functionality, so that if desired, derived
  17.   classes may further specialize this behavior.
  18.   """
  19.   def __init__(self, event, src=None, subj=None):
  20.     self.event = event
  21.     self.src   = src
  22.     self.subj  = subj
  23.   def __eq__(self, other):
  24.     # equality test
  25.     return (self.event == other.event) and 
  26.            (self.src   == other.src)   and 
  27.            (self.subj  == other.subj)
  28.   def __hash__(self):
  29.     # hash function 
  30.     return hash((self.event, self.src, self.subj))
  31.   def __repr__(self):
  32.     # supports debug display of this object
  33.     import gameevents
  34.     return '<%s : event [ %s ], source [ %s ], subject [ %s ]>' % (self.__class__.__name__, gameevents.byvalue[self.event], self.src, self.subj)
  35.   def RegisterHandler(self, handlers, handlerRef):
  36.     # this key maps to a dictionary of handlers
  37.     hDict = handlers.get(self, {})
  38.     if not hDict:
  39.       handlers[self] = hDict
  40.     hDict[handlerRef] = 1  # dictionary as a set
  41.   def UnregisterHandler(self, handlers, handlerRef):
  42.     # this key maps to a dictionary of handlers
  43.     hDict = handlers[self]
  44.     del hDict[handlerRef]
  45.     if len(hDict) == 0:
  46.       # remove unneeded key entries
  47.       del handlers[self]
  48.   def Lookup(self, handlers):
  49.     # return the dict for this key, or an empty one
  50.     return handlers.get(self, {})
  51. #
  52. # GameEventKey derived classes; used for
  53. # registering handlers according to specific
  54. # criteria.
  55. #
  56. class ByEvent(GameEventKey):
  57.   def __init__(self, event):
  58.     GameEventKey.__init__(self, event)
  59. class ByEventAndSource(GameEventKey):
  60.   def __init__(self, event, src):
  61.     GameEventKey.__init__(self, event, src)
  62. class ByEventAndSubject(GameEventKey):
  63.   def __init__(self, event, subj):
  64.     GameEventKey.__init__(self, event, None, subj)
  65. class ByEventSourceAndSubject(GameEventKey):
  66.   def __init__(self, event, src, subj):
  67.     GameEventKey.__init__(self, event, src, subj)
  68. def GetHandlers(key, handlers):
  69.   """
  70.   Retrieve a list of handlers for all possible
  71.   combinations of key criteria. We use a dictionary
  72.   so that each handler will be called only once.
  73.   """
  74.   hDict = {}
  75.   hDict.update(ByEvent (key.event).Lookup(handlers))
  76.   hDict.update(ByEventAndSource(key.event, 
  77.                key.src).Lookup(handlers))
  78.   hDict.update(ByEventAndSubject(key.event, 
  79.                key.subj).Lookup(handlers))
  80.   hDict.update(ByEventSourceAndSubject(key.event, 
  81.                key.src, key.subj).Lookup(handlers))
  82.   # since hDict is used as a set, the data we need
  83.   # is in the keys, not the values
  84.   return hDict.keys()  # list of handler references