socket.io - 检查一个人进入房间的时间

时间:2017-12-12 06:25:17

标签: node.js websocket socket.io

背景

所以我试图为我的游戏创建一个排队系统。我希望有人等待一分钟才能被分配到AI。我也喜欢那些等待更长时间才能匹配技能水平相近的对手的人。我想知道最好的方法。我是否应该为AI分配设置setTimeout和UTC时间来检查他们等待了多长时间?我只是想知道如果匹配后我将如何取消超时。

超时:

socket.on('waiting room', function (id) {
    console.log("socket has joined the waiting room", id);
    socket.join("waiting room")
    setTimeout(function() {
        socket.leave("waiting room")
        socket.join("some ai game")
    }, 60000)
})

1 个答案:

答案 0 :(得分:2)

我认为游戏服务器资源在游戏中是有限的,然后玩家必须等待。因此,当游戏服务器可用时,我们会让等待时间最长的玩家玩。然后逻辑看起来像下面的东西。



const waitinglist = []

//user leave waiting
const leaveWaiting = (socketid) => {
  waitinglist = waitinglist.filter((x) => x.socket.id != socketid)
}

io.on('connection', (socket) => {
  socket.on('waiting room', function(id) {
    console.log("socket has joined the waiting room", id);
    socket.join("waiting room")
    waitinglist.push({
      socket,
      time: new Date(),
    })
  })


  //leave by themselves
  socket.on('disconnect', () => {
    leaveWaiting(socket.id)
  })
  socket.on('cancle waiting', () => {
    leaveWaiting(socket.id)
    socket.leave("waiting room")
  })
})

//leave by other logic, like match/ai server available
matchResource.on('available', (resource) => {
  const {
    socket,
    time
  } = waitinglist.shift()
  socket.leave("waiting room")
  start_your_game(socket, resource)
})




全球等候名单,您可以将其替换为类似waiting-manager

的模块

当玩家进入waiting room时,将他排队

当游戏服务器可用时,从队列顶部获取一名玩家,然后让他玩

玩家是否退出或开始游戏,将他从队列中删除