javascript - 如何仅使用 socket.io、express 和 node.js 使服务器端 FUNCTION 执行到特定的命名空间房间
问题描述
我正在使用 socket.io、express 和 node.js 开发在线多人游戏,其中服务器检测有多少用户连接到命名空间上的特定房间,然后开始游戏。我的问题是我在服务器端编写了游戏函数,当我调用该函数以仅执行到名称空间上具有 2 个以上玩家的特定房间时,该函数在同时连接的所有名称空间房间中执行。我希望该功能仅在有超过 2 个用户连接到它们的命名空间房间中以不同的时间间隔执行,因为我的游戏处理的是一轮又一轮的时间。我尝试将 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);
})
我的预期是当用户连接到特定房间时,例如名称空间上的 GREEN ROOM,它应该计算房间中有多少用户,如果他们超过 2 个,则仅在名称空间上的特定频道中开始游戏,而是游戏回合正在开始,同时在命名空间上连接的所有通道上显示问题。
解决方案
更改mySocket.in(gameRoom).emit('go'
为
io.to(gameRoom).emit('go'
推荐阅读
- pdf - Sonarqube - 我如何制作摘要表
- javascript - 如何使用 javascript 连接到 socks 代理(在浏览器或前端)?
- python - 在谷歌云语音 api 中使用增强模型
- vba - VBA 根据值 1 从一个工作簿复制 2 列到另一个工作簿
- php - 如何创建登录控制器?代码点火器
- python - OpenCV:为什么 HoughCircles() 没有给出正确的结果?
- python - python中的小数舍入
- angular - 初始加载屏幕上的角度冻结 SVG 动画
- matlab - 将结果分配给离散分布 Matlab
- ajax - 在海边用 Ajax 替换图像