#javascript #node.js #express #socket.io
#javascript #node.js #экспресс #socket.io
Вопрос:
Я работаю над многопользовательской онлайн-игрой, используя socket.io , экспресс amp; node.js где сервер определяет, сколько пользователей подключено к определенной комнате в пространстве имен, и если затем запустить игру. Моя проблема в том, что я написал функцию game на стороне сервера, и когда я вызвал функцию для выполнения только в определенной комнате в пространстве имен, в которой более 2 игроков, функция выполняется во всех комнатах пространства имен, подключенных одновременно. Я хочу, чтобы функция выполнялась только в тех комнатах пространства имен, к которым подключено более 2 пользователей, и с разными интервалами, потому что моя игра имеет дело со временем, которое проходит раунд за раундом.Я пытаюсь использовать сокет.ввод-вывод с помощью экспресс- и 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:
Изменить mySocket.in(gameRoom).emit('go'
на
io.to(gameRoom).emit('go'
Комментарии:
1. извините, сэр, это все то же самое, функция выполняется во всех комнатах пространства имен одновременно
2. попробуйте
io.to(gameRoom)
вместоmySocket.to(gameRoom)