我正忙于学习 socket.io 并试图弄清楚如何让一些 JS 仅在两个用户都单击了他们的答案后才启动。
我想要触发的代码是:
// Random number function
function randomIntFromInterval(min,max){
return Math.floor(Math.random()*(max-min+1)+min);
}
// Check if correct + send to server
function correctAnswer() {
var correct = true;
socket.emit('playerCorrect', {answer: correct});
console.log(correct);
buttonRemover();
}
// Check if wrong + send to server
function incorrectAnswer () {
var wrong = false;
socket.emit('playerWrong', {answer: wrong});
buttonRemover();
}
socket.on ('updatePlayer', function (data) {
if (data.answer === true) {
console.log ('Player got it right! ' + data.answer);
}else if (data.answer === false) {
console.log ('Player got it wrong! ' + data.answer);
}
});
这些函数正在向服务器发送数据,让服务器知道答案是否正确。
socket.on('playerCorrect', function (data) {
io.sockets.emit('updatePlayer', data);
dataRequest();
});
socket.on('playerWrong', function (data) {
io.sockets.emit('updatePlayer', data);
dataRequest();
});
但是,我只希望当两个客户端都单击某个选项时发生这种情况。有办法追踪吗?
最佳答案
对于一组用户,只需执行以下操作就足够了:
// Global variables for maintaining game states
// TODO: Clear this when a new game is started
var nrecieved = 0;
var responses = {}; // Socket id to response
function finish(/* todo: maybe also pass in a game_id or one of the user ids to know which game is being played */){
// Loop through users in game and send them their responses
for(var id in responses){
if(responses.hasOwnProperty(id)){
// Send the response
io.to(id).emit('updatePlayer', responses[id]);
}
}
}
socket.on('playerCorrect', function (data) {
responses[socket.id] = data;
nrecieved++;
if(nrecieved == 2){
finish();
dataRequest();
}
});
socket.on('playerWrong', function (data) {
responses[socket.id] = data;
nrecieved++;
// Only respond if both responses received
if(nrecieved == 2){
finish();
dataRequest();
}
});
socket.id
是分配给每个套接字的唯一标识符,这可能很有用。对于多游戏性能,您可能需要更多逻辑来维护哪些套接字/玩家属于哪些游戏的列表,然后使用该列表将消息定向到正确的用户对。
关于javascript - 等待双方玩家选择答案的 Socket.io 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165340/