我正在构建一个游戏,为了让玩家开始游戏,他们应该按下一个按钮,当同一个房间里的每个人都点击屁股时,游戏就会开始。
问题是我只设法做到这一点,而没有指定哪个房间发送了"我准备好了消息",所以我只计算连接的玩家数量,无论他们来自哪里:
代码给出一个示例:
socket.on('userReady', function(){
userReadyCounter++;
if(userReadyCounter === connectionCounter){
gameDuration = 180
io.sockets.in(socket.room).emit('startGame');
io.sockets.in(socket.room).emit('newSentence', sentences[socket.sentenceCounter]);
}
})
连接对应部分:
socket.on('joinedRoom', function(roomData){
socket.username = roomData.username;
socket.room = roomData.roomname;
socket.sentenceCounter = 0;
connectionCounter++;
socket.join(socket.room);
socket.broadcast.to(socket.room).emit('userJoined', socket.username);
});
客户:
function userReady(){
socket.emit('userReady');
}
所以每次用户发送消息时,我都无法分辨他们来自哪里......
我这样做不正确吗?
您无法在客户端上检测发送数据的房间。 首先,房间不发送消息或数据。 服务器发送数据。 服务器可能会遍历房间中的所有连接并发送给它们,但消息实际上不是由聊天室发送的,而是由服务器发送的。 而且,该消息中根本没有包含有关它与哪个房间关联的任何信息。
因此,要知道消息在客户端中与哪个房间相关联的唯一方法是,如果您之前创建了与房间关联的一些关联,以便客户端只知道它收到的消息与特定房间相关联,或者如果您在消息本身中发送与消息关联的实际房间。 这将是最简单的方案:
socket.room = roomData.roomname;
socket.join(socket.room);
socket.broadcast.to(socket.room).emit('userJoined', {
user: socket.username,
room: socket.room
});
然后,到达客户端的每条此类消息都会准确地通知客户端它与哪个房间相关联。