Отправка одних и тех же данных с помощью setInterval для пользователей

#javascript #node.js #socket.io

#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. Эта часть кода не включена в ваш вопрос.

2. @remisayousefv и какая часть?

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

4. @Remisayousefv И что ж, я добавил это, но это не сильно поможет

5. Это очень помогло. Вы устанавливаете интервал для любого нового соединения. Вот почему два пользователя получают информацию дважды, и если добавляется третий, все 3 из них получают 3 сообщения с разным содержанием.

Ответ №1:

Это проблема дизайна. У вас есть несколько пользователей, и они могут подключаться к вашему серверу, и вы хотите информировать подключенных пользователей о том, что что-то происходит. Сначала выньте 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.
})
  

Комментарии:

1. У меня есть массив пользователей в блоке кода подключения ввода-вывода. Но опять же, если я setInterval выйду из io.on , как нанести урон монстру?

2. Зачем вам нужен emit ? уведомлять пользователей в, setInterval хотя делать это с emit также возможно.

3. Как тогда я могу просто отправлять данные в режиме реального времени без сокета пользователям? хм, setInterval теперь в Route не в io.on

4. Что использовать для уведомления пользователей о событии?

5. @zlotte: сохраните ссылку на сокет пользователя в вашей глобальной структуре данных (в моем примере массив), затем используйте сокет каждого пользователя, чтобы сообщить ему.