在MMORPG中实现服务器端命令处理的可扩展方法是什么?

Ed *_*fer 6 c# architecture

更新:如果我的问题不够明确,我很抱歉.我已经读过关于命令模式的内容,但遗憾的是我自己没有使用它.我试图找出如何使用它(或其他一些模式)来使游戏事件足够抽象,服务器可以使用单个Process()方法处理它们.我主要挂断的是确保游戏事件能够获得足够的信息以实际执行他们需要做的事情(例如,登录用户并将其添加到活动用户列表,发送地图数据,移动玩家等).非常感谢一个相关的例子.

我对游戏开发很陌生,但决定在业余时间开始研究(相对)简单的2D MMORPG.我认为自己是一个非常有能力的程序员,我有很好的技能基础,但我仍然在努力解决与客户端 - 服务器游戏相关的一些设计问题.具体来说,我很难想到一种可扩展的方法来处理命令.让我提供一个功能示例:

登录请求

  1. 开始游戏
  2. 点击"继续"
  3. 输入用户名和密码
  4. 点击"登录"
  5. 当您退出时,无论您身在何处,都可以看到角色

从客户端 - 服务器架构的角度来看,这就是我现在正在做的事情:

[客户]

  1. SimpleTextNetworkMessage发送到服务器 - {LogInRequest,UN:[UserName] | PW:[Password]}
  2. 使UI变暗并等待响应(超时:10秒)
  3. 从服务器接收SimpleTextNetworkMessage - {LogInSuccessResponse,[Player ID]}
  4. SimpleTextNetworkMessage发送到服务器 - {GetPlayerInfoRequest,[Player ID]}
  5. 从服务器接收SimpleDataNetworkMessage - {GetPlayerInfoResponse,[Player Info]}
  6. SimpleTextNetworkMessage发送到服务器 - {GetMapInfoRequest,[Player ID]}
  7. 从服务器接收SimpleDataNetworkMessage - {GetMapInfoResponse,[MapData]}
  8. 画出画面

我的示例确定了发生的三个关键事件:

处理登录

验证用户提供的信息,从数据库(HP,MP,最后位置等)下载播放器信息,并将播放器与地图和连接相关联.

获取玩家信息

发回有关玩家的统计数据,设备,经验,当前地图ID以及需要在UI上显示的任何其他内容的信息.

获取地图信息

向玩家发送有关50瓦片半径内所有瓦片的信息...这应该包括三层地图的瓦片信息以及NPC /怪物/玩家的位置和名称; 当玩家移动时,将请求/更新更多地图信息.

您可以看到每个过程都不​​同,需要不同的信息.在服务器端,我该怎么做:

while (ServerIsRunning)
{
   foreach (Client c in clients)
   {
      eventQueue.AddList(c.ReceiveAll());
   }

   foreach(GameEvent event in eventQueue)
   {
      event.Process();
   }

   int[] keys = messageQueue.Keys;

   foreach (int key in keys)
   {
      Client c = clients.Get(key);

      foreach(NetworkMessage message in messageQueue[key])
      {
         c.Send(message);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

CPe*_*ins 1

当我读到你所问的内容时,你似乎在要求“一种实现命令处理的可扩展方式”。

从您的措辞方式来看,您的请求显然指向Command Pattern

我不是 C# 人员,所以遗憾的是我无法评估 Google 提供的大量建议。这是一个帮助您入门的方法。 http://www.c-sharpcorner.com/UploadFile/cupadhyay/CommandPatternsInCS11142005021734AM/CommandPatternsInCS.aspx