【问题标题】:socket.io - check how long a person has been in a roomsocket.io - 检查一个人在房间里呆了多长时间
【发布时间】:2017-12-12 06:25:16
【问题描述】:

背景

所以我正在尝试为我的游戏创建一个排队系统。我希望有人等了一会儿才被分配对抗 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)
})

【问题讨论】:

  • 你可以使用 clearTimeout();取消超时
  • @Mehari 我怎么知道是哪一个?如果我将它分配给一个变量,它会是每个套接字吗?

标签: node.js websocket socket.io


【解决方案1】:

我认为游戏服务器资源有限,玩家必须等待。因此,当游戏服务器可用时,我们将等待时间最长的玩家放入游戏中。然后逻辑如下所示。

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时,让他入队

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

无论玩家退出还是开始游戏,都将他从队列中移除

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2018-07-05
    • 2020-10-28
    • 2017-05-12
    • 2016-12-14
    • 2021-11-12
    • 2019-06-25
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多