我正在使用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),服务器就会加入这些玩家。这样,服务器将根据需要创建尽可能多的房间(表)。 但是这些排队的玩家都是随机玩家,他们可能不一定想互相玩耍。如果玩家想与他们的朋友一起玩,这将是一个问题。
答案 0 :(得分:0)
使用Socket.io房间功能,是否有更动态的方式或更好的方式来创建房间(在我的情况下是游戏桌),不同玩家限制ON DEMAND?
socket.io房间是完全动态的。你不“创造一个房间”。相反,您只需将套接字连接到房间,即可自动创建该房间。同样,您也不会删除删除。当最后一个插座离开房间时,房间就会消失。
因此,如果您使用socket.io会议室而不是表格,那么他们的创作将完全按需提供。您可以随时迭代服务中的房间。您可以随时迭代房间中的套接字。您可以随时在房间中添加或删除套接字。