#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: сохраните ссылку на сокет пользователя в вашей глобальной структуре данных (в моем примере массив), затем используйте сокет каждого пользователя, чтобы сообщить ему.