当用户连接到我的插座时 我添加到会话映射:
io.on('connection', function (socket) {
sessionMap.set(socket.id,socket);
}
我的会话地图
var SessionMap = {};
module.exports = {
set: function(key,value){
SessionMap[key] = value;
},
get: function(key){
return SessionMap[key]
},
delete: function(key){
delete SessionMap[key]
},
all: function(){
return SessionMap
}
}
还将我的用户套接字ID保存在类播放器中
socket.on('addPlayer-Queue', (result) => {
sessionMap.set(socket.id,socket);
queue.addPlayer(new Player({
id: result.id,
name: result.name,
mmr: result.mmr
}, socket.id));
我有一个功能,可以选择两个相连的玩家(我保存在一个阵列中)并创建一个“战斗”,然后我想发送到为此战斗选择/匹配的套接字 战斗骰子
这是我选择两个玩家并进行战斗的角色:
searching() {
const firstPlayer = this.getRandomPlayer();
const secondPlayer = this.players.find(
playerTwo =>
playerTwo.mmr < this.calculateLessThanPercentage(firstPlayer) &&
playerTwo.mmr > this.calculateGreaterThanPercentage(firstPlayer) &&
playerTwo.id != firstPlayer.id
);
if (!secondPlayer) {
return null;
}
const matchedPlayers = [firstPlayer, secondPlayer];
this.removePlayers(matchedPlayers);
return new Match(matchedPlayers);
}
}
而且在连接时,我使用设定的间隔每1秒执行一次此功能
但是我的困难是如何将这场战斗中的数据发送到相应的套接字上
我与播放器的关系套接字
当玩家进入我的活动时,我会通过查看套接字ID来创建玩家 我也为此套接字创建了一个会话映射 sessionMap.set(socket.id,socket);
我的班级球员:
class Player {
constructor(player,socketId) {
this.id = player.id
this.socketId = socketId
this.name = player.name
this.mmr = player.mmr
}
}
module.exports = Player;
答案 0 :(得分:1)
const getMatchConfigurationFor = player => {
/* configure and return the payload notifying the player of the match */
}
const configurePlayersForNewMatch = () => matchedPlayers.forEach(player =>
sessionMap.get(player.socketid)
.broadcast.to(player.socketid)
.emit(messageTags.MATCH_CONFIGURATION,
getMatchConfigurationFor(player)))
关于在何处进行这项工作<。> single responsibility principle说,一个功能应该有一个明确的目的。因此, search 方法应搜索匹配的球员,而不是配置比赛。您应该在配置匹配项时调用另一个函数来完成这项工作,该函数本身将在搜索成功返回之后被调用。我在这里提供了包装函数:它的编写方式希望相关的部分都在范围之内。如果愿意,可以使用参数将其重写为适当的函数。
这是Felipe的正在进行中的解决方案,应要求发布。
答案 1 :(得分:0)
找到比赛之后,您可能想向两个客户端发出MatchFound
对象,详细说明有关比赛的信息(包括有关对手的信息)。客户获得此权限后,您可以启动客户匹配所需的任何操作(加载关卡,显示名称或大厅)。