2012-03-29 69 views
2

我正在用Node.js和Socket.io构建一个大型多人游戏。所有玩家都会在同一张无限地图上移动(想想Minecraft)。随着玩家的移动,我加载他们看得见的瓷砖。当玩家移动他们的动作时应该发送给所有可以看到他们的玩家。在多人Socket.io游戏中管理套接字

我的问题是;我应该如何去构建我的套接字?对于所有玩家来说只有一个插座看起来好像不会缩放。我可以将世界分成块,但我不知道如何管理块边界。由于大多数玩家在大部分时间都无法看到对方,所以我更希望每个玩家的套接字只能获得与他们相关的更新。

我读过,Socket.io有一个“房间”的概念,它们只是能够得到相同消息的套接字。为每个连接的玩家设置一个单独的房间,我可以添加任何其他在附近移动的玩家的插槽,这是否可行?然后,每次玩家移动时,我都可以向该房间发送消息。当观众离开或加入房间时,我该如何管理?

显然这是一个模糊的问题,但我只是寻找最佳实践建议。有关该主题的文章的链接将不胜感激。

+1

您是否想过使用[Quadtrees](http://en.wikipedia.org/wiki/Quadtree)查找玩家位置?开始寻找如何解决这个问题的好地方是[BrowserQuest源代码](https://github.com/mozilla/BrowserQuest)。 – hughsk 2012-03-30 00:16:23

回答

3

这是设计MMO服务器的基本问题之一。一般而言,您希望每个客户端都有一个套接字,并且您可以实现将客户端的逻辑推送到特定区域。

区域是设置'渠道'来控制数据订阅的好方法。您可以为每个地区分配不同的名称,并使用Socket.io房间将玩家订阅到某个地区。

毕竟这是事情,事情变得更加容易处理。因此,如果玩家在特定区域内移动,则服务器所要做的就是将“玩家移动”事件发送给事件X米内所有地区的所有用户。

+0

你是什么意思“每个客户端套接字”?它是每个客户端的一个websocket服务器(因此每个客户端的IP或端口不同),或者每个客户端在同一个服务器IP /端口上有一个连接?尽管如此,我也遇到了同样的问题。 – 2014-07-26 04:44:46