Как заставить серверную ФУНКЦИЮ выполняться в определенной комнате пространства имен только с использованием socket.io, express и node.js - PullRequest
0 голосов
/ 17 апреля 2019

Я работаю над многопользовательской онлайн-игрой с использованием socket.io, express & node.js, где сервер определяет, сколько пользователей подключено к определенной комнате в пространстве имен, и если затем, то запускает игру.Моя проблема в том, что я написал игровую функцию на стороне сервера, и когда я вызвал эту функцию, чтобы она выполнялась только в определенной комнате в пространстве имен, в которой более двух игроков, функция выполняется во всех комнатах пространства имен, подключенных одновременно.Я хочу, чтобы функция выполнялась только в тех комнатах пространств имен, к которым подключено более двух пользователей, и с разными интервалами, потому что моя игра имеет дело со временем, раунд за раундом. Я пытаюсь использовать socket.io с express и node.jsреализовать это.Любая помощь будет оценена.

   //on the server side

    var express = require('express');
    var app = express();
    var fs = require('fs');
    var path = require('path');
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    var logger = require('winston');
    var port = process.env.PORT || 4000;

    var mySocket= io.of('/games');

    //this function shows the game question 

    function showGameQuestion() {
         var question = 'How many states do we have in america?';
         return question
     }

    // this is the main game function where the game logic goes

    function playGame(gameRoom) {
       status = "chat";
       countdown = 10;
       setInterval(function() {
           countdown--;
           if (status == "chat") {
               showChat = 'you can chat now';
               if (countdown <= 0) {
                  status = "play";
                  countdown = 20;
                  showLetter = showGameQuestion();
                  mySocket.in(gameRoom).emit('go', { countdown: countdown, 
                  showMessage:showLetter, status:status });

               }
             }
             console.log(countdown);
         },1000)
   }
  //creating the socket connection

  mySocket.on('connection', function (socket) {
      socket.on('addPlayer', function (data) {
      socket.getRoomName = data.getRoomName;
      socket.join(socket.getRoomName);
      mySocket.in(socket.getRoomName).clients((error, clients) => {
      if (error) throw error;
         numUsers = clients.length;
         if(numUsers >=3){
            //calling the play game function
            playGame(socket.getRoomName);

          }
        })
     });


   //on the client side 

   var socket = io("/games");
     $("#joinBtn").click(function(){
       getRoomName = $("#roomName").val();
       socket.emit('addPlayer', getRoomName)
      })
     socket.on('go', function(data){
     $("#showQuestion").text(data.showLetter);
     })

То, что я ожидал, было, когда пользователь подключен к определенной комнате, например, ЗЕЛЕНАЯ КОМНАТА в пространстве имен, он должен подсчитать, сколько пользователей в комнате, и если их больше 2, запустить игру тольков этом конкретном канале в пространстве имен, но вместо этого начинается игровой раунд, показывающий вопрос по всем каналам, подключенным к пространству имен одновременно.

1 Ответ

0 голосов
/ 17 апреля 2019

Изменить mySocket.in(gameRoom).emit('go' на

io.to(gameRoom).emit('go'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...