2012-03-29 68 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