所以我想对连接到游戏的所有用户发送相同的怪物伤害。我认为目前的问题是我的代码在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) {
中。所以我相信如果有两个玩家,两个连接发送了两个损害赔偿,或者我错了?
答案 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.
})