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

📄 objmgr.py

📁 大型多人在线游戏开发,该书光盘上附带的源码
💻 PY
字号:
# objmgr.py
#
# Implements the ability to address objects by an 
# id, avoiding the need to hold on to object references.
# This prevents reference counting and garbage collection
# problems associated with circular references.
# 
# The deferred call implementation uses object ids to
# identify the recipient of a deferred method call.
#
# Author: Matthew Walker
#         mwalker@softhome.net
#

import string
import types

def __ModuleInit__():
  """
  Set up module-level attributes
  """
  global g_gameobjects
  global g_ids
  global g_players_clients
  global g_clients_players
  global g_rooms

  g_gameobjects = {}
  g_ids = 0
  g_players_clients = {}
  g_clients_players = {}
  g_rooms = {}

__ModuleInit__()  # at first import



#
# Module functions - for managing all objects in the game
#
def NextId():
  """
  Generate a new object id.
  """
  global g_ids
  g_ids = g_ids + 1
  return g_ids


def AddObject(ob, id):
  """
  Add a game object to the manager using the id provided.
  """
  assert(type(id) == types.IntType)
  g_gameobjects[id] = ob


def RemoveObject(ob):
  """
  Remove an object from the game, None if it fails.
  """
  try:
    del g_gameobjects[ob.id]
    return ob.id
  except KeyError:
    print 'Cannot remove %s: not in map.' % (ob,)
    return None
 

def GetObject(id):
  """
  Return the object with the requested id, or None 
  if it doesn't exist.
  """
  try:
    return g_gameobjects[id]
  except KeyError:
    import traceback
    traceback.print_exc()
    print 'Invalid object id: %s' % (id,)
    return None


def RegisterPlayer(clientid, playerid):
  """
  Associate a player with a specific client.
  """
  if g_clients_players.get(clientid) or g_players_clients.get(playerid):
    raise RuntimeError("Duplicate player registration.")
  g_clients_players[clientid] = playerid
  g_players_clients[playerid] = clientid


def UnregisterPlayer(clientid, playerid):
  """
  Dis-associate a player with a specific client.
  """
  del g_players_clients[playerid]
  del g_clients_players[clientid]


def GetPlayerByClientId(clientid):
  """
  Get a player object based on a client id.
  """
  playerid = g_clients_players[clientid]
  player = GetObject(playerid)
  return player


def GetPlayerByName(name):
  """
  Get a player object based on its name.
  NOTE: there is no enforcement of unique names.
  """
  for playerid in g_players_clients.keys():
    player = GetObject(playerid)
    if player.name == name:
      return player
  return None


def GetObjectByName(name):
  """
  Get a generic object based on its name. Player
  objects are also included.
  NOTE: there is no enforcement of unique names.
  """
  for objectid in g_gameobjects.keys():
    object = GetObject(objectid)
    try:
      if object.name == name:
        return object
    except:
      # some objects don't have a name - that's okay
      pass
  return None


def RegisterRoom(room):
  """
  Provide the ability to identify a room by its name.
  """
  if g_rooms.get(string.upper(room.name)):
    raise RuntimeError('Registering duplicate room %s' % (room.name,))
  g_rooms[string.upper(room.name)] = room.id


def GetRoomIds():
  """
  Return a list of all room ids.
  """
  return g_rooms.values()


def GetRoomByName(roomname):
  """
  Get a room (sandbox) object based on its name.
  NOTE: there is no enforcement of unique names.
  """
  roomid = g_rooms[string.upper(roomname)]
  room = GetObject(roomid)
  return room


⌨️ 快捷键说明

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