2017-12-22 3 views
0

node.js + socket.io를 사용하여 멀티 플레이어 게임을 만들고 있습니다. 플레이어는 각 방에 최대 3 명의 플레이어가있는 방으로 그룹화됩니다. 알고리즘은 방의 수를 추적하고 최신 방의 플레이어 수를 방 번호로 확인하는 것입니다. 최신 방의 플레이어 수가 3 명 이상인 경우 프로그램에서 방 번호를 증가시키고 다음에 참여할 소켓/플레이어가 새 방 ("room"+ roomNumber)에 참여합니다. 내가 겪고있는 문제는 이전 방이 3 명의 플레이어가있을 때 플레이어가 새로운 방에 합류하더라도 이전 플레이어가 새로운 방으로 이동한다는 것입니다. 내 코드의 어떤 부분이이 동작을 일으키는 지 알지 못합니다.Node.js + Socket.io : 한 방에서 다른 방으로 이동하는 플레이어

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); 
     } 
    } 
} 

답변

0

나는 namespace.clients가 asyncronous이기 때문에이 있다고 믿고, 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); 
...