通过setInterval为用户发送相同的数据

时间:2019-04-03 20:02:09

标签: javascript node.js socket.io

所以我想对连接到游戏的所有用户发送相同的怪物伤害。我认为目前的问题是我的代码在io.on('connection', function (socket) {中,如果有两个用户在不同的时间加入,则损坏将同时发送给两个用户两次,并且与53, 24类似。我需要实现,无论玩家何时加入游戏,伤害都应该只发送一次,并且对所有玩家来说都必须相同。现在,我每隔5秒钟从服务器发送一次。我想做的是将带有损坏的时间戳存储在数据库中,并将其发送给所有用户。还是我可以用目前的代码实现这一目标?

io.on('connection', function (socket) {

    setInterval(() => {
        monsterDamage = Math.floor(Math.random() * monsters[defeats.defeats].damageB) + monsters[defeats.defeats].damageA;

        User.findOne({username: username, ingame: true}).then((user) => {
            if(!user) {
                return console.log('User not found');
            }
                user.hp -= monsterDamage;
                if(user.hp < 0 || user.hp === 0) {
                    user.hp = 0;
                    user.ingame = false;
                    console.log('You LOST');
                }

                io.emit('monster-attack', {
                    damage: monsterDamage
                });
                console.log(monsterDamage);

                user.save();
        });

    }, 5000);

});

请记住,此代码位于io.on('connection', function (socket) {中。所以我相信如果有两个玩家,两个连接发送了两个损害赔偿,或者我错了?

1 个答案:

答案 0 :(得分:0)

这是一个设计问题。您有一些用户,他们可能连接到您的服务器,并且您想在发生某些情况时通知已连接的用户。首先从setInterval中取出io.on('connection'

io.on('connection'中,例如在数组中跟踪用户(记住在连接关闭时将其删除)。现在,您有了全局阵列中所有已连接用户的更新列表。

setInterval部分中,将消息发送到该数组的成员。

代码示例:

const users = []

// io defined

setInterval(() => {
  // iterate users array and notify them of event
})

io.on('connection', (socket) {
  // update users array for example: users.push(socket)
})

io.on('disconnect', (socket) {
  // update users array. Remove disconnected user from array.
})