【问题标题】:Socket.io event that waits for both players to have chosen answers等待双方玩家选择答案的 Socket.io 事件
【发布时间】:2016-07-02 23:31:03
【问题描述】:

我正忙于学习 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();
});

但是,我只希望在两个客户都单击一个选项时发生这种情况。有没有办法跟踪这个?

【问题讨论】:

    标签: javascript jquery socket.io


    【解决方案1】:

    对于一组用户,这样做就足够了:

    // 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 是分配给每个套接字的唯一标识符,它可能很有用。对于多游戏性能,您可能需要更多逻辑来维护哪些套接字/播放器属于哪些游戏的列表,然后使用该列表将消息定向到正确的用户对。

    【讨论】:

    • 我想这都是服务器端处理的? :)
    • 是的,只要您跟踪哪些游戏正在与哪些用户一起玩,这一切都可以在服务器上完成。客户端传回他们正在玩的用户(可能是他们的 id 或名称)或其他帮助服务器知道参与其中的用户可能会有所帮助,但这不是必需的
    • 我有一个允许他们输入用户名等的套接字。我只是没有跟踪他们的唯一 ID。如何创建游戏的多个实例或创建不同的大厅?
    • 我也注意到这很好用。但是当第二个玩家回答时它不会记录他们的回答? :)
    • 大厅相当简单:你可以说向他们询问大厅名称,每当你向服务器发送请求时,包括当前大厅名称,并且在服务器上,你可能有一些变量 @987654323 @,其键为lobbies[name] = {some data for this lobby/game}。这样,当服务器收到请求时,它可以使用 'lobbie[name]' 作为上下文。同样,为了配对用户,客户端可能会发送对手的 id/name
    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2013-02-22
    • 2022-06-30
    • 1970-01-01
    • 2015-10-11
    • 2022-01-13
    相关资源
    最近更新 更多