⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameeventkeys.py

📁 大型多人在线游戏开发,该书光盘上附带的源码
💻 PY
字号:
# gameeventkeys.py
#
# Implements the event key objects, which 
# allows precise registration for events 
# based on specific criteria.
# 
# Author: Matthew Walker
#         mwalker@softhome.net
#

class GameEventKey:
  """
  Event key base class.
  Responsible for providing the equality and hashing
  operators which allow this object and its derived
  classes to be used as dictionary keys. Also 
  responsible for implementing the event registration
  and lookup functionality, so that if desired, derived
  classes may further specialize this behavior.
  """
  def __init__(self, event, src=None, subj=None):
    self.event = event
    self.src   = src
    self.subj  = subj

  def __eq__(self, other):
    # equality test
    return (self.event == other.event) and \
           (self.src   == other.src)   and \
           (self.subj  == other.subj)

  def __hash__(self):
    # hash function 
    return hash((self.event, self.src, self.subj))

  def __repr__(self):
    # supports debug display of this object
    import gameevents
    return '<%s : event [ %s ], source [ %s ], subject [ %s ]>' % (self.__class__.__name__, gameevents.byvalue[self.event], self.src, self.subj)

  def RegisterHandler(self, handlers, handlerRef):
    # this key maps to a dictionary of handlers
    hDict = handlers.get(self, {})
    if not hDict:
      handlers[self] = hDict
    hDict[handlerRef] = 1  # dictionary as a set

  def UnregisterHandler(self, handlers, handlerRef):
    # this key maps to a dictionary of handlers
    hDict = handlers[self]
    del hDict[handlerRef]
    if len(hDict) == 0:
      # remove unneeded key entries
      del handlers[self]

  def Lookup(self, handlers):
    # return the dict for this key, or an empty one
    return handlers.get(self, {})


#
# GameEventKey derived classes; used for
# registering handlers according to specific
# criteria.
#
class ByEvent(GameEventKey):
  def __init__(self, event):
    GameEventKey.__init__(self, event)

class ByEventAndSource(GameEventKey):
  def __init__(self, event, src):
    GameEventKey.__init__(self, event, src)

class ByEventAndSubject(GameEventKey):
  def __init__(self, event, subj):
    GameEventKey.__init__(self, event, None, subj)

class ByEventSourceAndSubject(GameEventKey):
  def __init__(self, event, src, subj):
    GameEventKey.__init__(self, event, src, subj)



def GetHandlers(key, handlers):
  """
  Retrieve a list of handlers for all possible
  combinations of key criteria. We use a dictionary
  so that each handler will be called only once.
  """
  hDict = {}
  hDict.update(ByEvent (key.event).Lookup(handlers))
  hDict.update(ByEventAndSource(key.event, 
               key.src).Lookup(handlers))
  hDict.update(ByEventAndSubject(key.event, 
               key.subj).Lookup(handlers))
  hDict.update(ByEventSourceAndSubject(key.event, 
               key.src, key.subj).Lookup(handlers))

  # since hDict is used as a set, the data we need
  # is in the keys, not the values
  return hDict.keys()  # list of handler references


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -