Socket.io房间功能可根据需要创建游戏桌

时间:2017-03-11 08:49:33

标签: javascript node.js socket.io

我正在使用JS和socket.io来制作多人游戏。

玩家限制范围为2-5。

我想要实现的目标是:

1:在客户端浏览器上有一个下拉列表,显示所有游戏桌名称及其最大玩家限制。玩家可以通过点击加入任何房间。

2:达到桌面播放器限制后,房间无法再次加入。

3:每个房间的玩家都可以玩自己的游戏,在自己的频道聊天而不会分心。

在我目前的设计中有一个静态房间对象,在房间项目中有一组预先创建的表格对象。表对象具有游戏所需的许多属性和方法。

服务器端房间和表格对象:

function Room(name) {  
this.players = [];
this.tables = [];
};

function Table(tableID){  
this.id = tableID;
this.players = [];
this.maxPlayerLimit = 4;
}; 

我可以预先创建表数量,并将这些表格对象推送到房间的表格数组。

Room.prototype.createTables = function(amount) {
var tableList = [];
for(var i = 0; i < amount; i++){
    var table = new Table(i+1);
    table.setName("Table" + (i + 1));
    tableList.push(table);
}
return tableList;
};

客户端点击下拉列表时:

下拉列表看起来像https://jsfiddle.net/1oyy98uo/

socket.emit("connectToTable", {tableID:TableID,tableName: tableName,limit:limit}); //这些信息基于下拉列表中的表格选择

当玩家连接到服务器时,我将它们推送到静态房间播放器阵列。

当他们选择一张桌子时,我会

socket.on('connectToTable',function(data) {
  var player = room.player(socket.id)// (room method to get the socket player)
  var table = room.table(data.tableID); //(room method to get the table)
  table.Name(data.tableName)//(table method to set name)
  table.maxPlayerLimit = Number(data.limit)
  if (tableisAvailable){
   table.join(player)//table method to add player to its list
  if(table.players.length===maxPlayerlimit){
   init the game
   }else{
   client.emit("table is full")//then the client would know to go elsewhere
   }
   }
   })

我的设计实现了所有目标。但它是以这种硬编码的方式完成的。 预先创建的表可能太多或太少。使用我当前的设计解决此问题的唯一方法是创建比预期更多的房间。

我不确定我是否仍然坚持使用我目前的设计或socket.io房间功能可以提供更好的解决方案。 (按需创建游戏桌)

但按需方案存在缺陷:

玩家提出加入房间(桌子)的请求,一旦请求达到某个限制(如4),服务器就会加入这些玩家。这样,服务器将根据需要创建尽可能多的房间(表)。 但是这些排队的玩家都是随机玩家,他们可能不一定想互相玩耍。如果玩家想与他们的朋友一起玩,这将是一个问题。

1 个答案:

答案 0 :(得分:0)

  

使用Socket.io房间功能,是否有更动态的方式或更好的方式来创建房间(在我的情况下是游戏桌),不同玩家限制ON DEMAND?

socket.io房间是完全动态的。你不“创造一个房间”。相反,您只需将套接字连接到房间,即可自动创建该房间。同样,您也不会删除删除。当最后一个插座离开房间时,房间就会消失。

因此,如果您使用socket.io会议室而不是表格,那么他们的创作将完全按需提供。您可以随时迭代服务中的房间。您可以随时迭代房间中的套接字。您可以随时在房间中添加或删除套接字。