node.js socket.io:玩家从一个房间转移到另一个房间



我正在使用node.js socket.io创建一个多人游戏。玩家分组成房间,每个房间最多有3个玩家。该算法是要跟踪房间的数量,并检查最新房间中的玩家数量(按房间编号)。如果最新房间中的玩家数量超过3个,则该程序会增加房间号,而加入的下一个插座/播放器将加入新房间("房间" Roomnumber)。我遇到的问题是,即使该程序正确地让玩家在上一个房间有3个玩家时也加入了一个新房间,但以前的玩家也被转移到新房间。我看不出我的代码的哪一部分会导致这种行为发生。

var players = [];
var player;
var playerUsernames = [];
var express = require("express");
var socket = require("socket.io");
var app = express();
var server = app.listen(3000);
app.use(express.static("public"));
function Player(username) {
    this.username = username;
}
var io = socket(server);
var roomNumber = 1;
setInterval(distributor, 33);
function distributor() {
    io.sockets.in("room" + roomNumber).emit("distributor", players);
}
io.sockets.on("connection", transmitter);
function transmitter(socket) {
    io.of('/').in("room" + roomNumber).clients(function(error,clients){
        var numClients = clients.length;
        if (numClients > 3) {
            roomNumber++;
        }
    });
    io.of('/').in("room" + roomNumber).clients((error, clients) => {
        console.log(clients); // Problem: Displays that players in room 2 include all of the players in room 1
    });
    socket.join("room"+roomNumber);
    socket.on("player", playerMsg);
    function playerMsg(data) {
        player = new Player(data.username);
        if (playerUsernames.indexOf(data.username) == -1 && data.hp == 100) {
            players.push(player);
            playerUsernames.push(data.username);
        }
        else {
            var index = playerUsernames.indexOf(data.username);
            players[index] = player;
        }
    }
    socket.on("players", setPlayers);
    function setPlayers(sentPlayers) {
        players = sentPlayers;
        playerUsernames = [];
        for (var i = 0; i < players.length; i++) {
            playerUsernames.push(players[i].username);
        }
    }
}

我相信这是因为命名空间。clients是异步的,socket.join加入旧房间

因此,您最好将代码更新以跟踪已经加入PPL,到最后一个房间:

var roomNumber = 0;
var lastRoomCount = 0;
var maxRoomCount = 3;
function transmitter(cSocket) { // better name it other name than global "var socket"
...
  lastRoomCount=(lastRoomCount+1)%maxRoomCount;
  if (!lastRoomCount) roomNumber++;
  cSocket.join("room" + roomNumber);
...

最新更新