【发布时间】:2014-12-15 13:50:41
【问题描述】:
这个问题的标题确实措辞不正确,但我不知道如何措辞。如果有人想编辑它,请随意。
基本上,我试图弄清楚如何通过数据来自的套接字获取玩家的特定实例,这将用于通过我的服务器为我的小型 2d 项目中继运动。目前我有一个对象,它通过标识号存储所有玩家,有人说它是一个对象,有人说它是一个 hashmap 实现,有人说它是一个数组,不管它是什么,我都在使用它。
var connectedPlayers = {};
创建连接后,我会像这样创建一个新播放器:
var playerId = Math.floor(Math.random()*(50000-1+1)+1);
var userId = Math.floor(Math.random()*(50000-1+1)+1);
var player = new Player(playerId, "Guest"+userId, socket);
connectedPlayers[playerId] = player;
显然,这只是暂时生成随机名称/标识号,但这很好,这是在 socket.on('connection', function() 调用上执行的。
如果您需要查看 Player.js 脚本,它只是一个基本的原型脚本,它向所有玩家发送有关玩家登录的信息,这一切正常。
var playerId;
var playerName;
var socket;
var positionX, positionY;
function Player(playerId, playerName, socket) {
this.playerId = playerId;
this.playerName = playerName;
this.socket = socket;
this.positionX = 250;
this.positionY = 250;
socket.emit('login', { playerID: playerId, playerX: this.positionX, playerY: this.positionY, playerName: playerName});
socket.broadcast.emit('player-connected',{ playerID: playerId, playerX: this.positionX, playerY: this.positionY, playerName: playerName} )
}
Player.prototype.getId = function() {
return this.playerId;
};
Player.prototype.getName = function() {
return this.playerName;
};
Player.prototype.getSocket = function() {
return this.socket;
};
Player.prototype.getX = function() {
return this.positionX;
};
Player.prototype.getY = function() {
return this.positionY;
};
我的问题是,当数据进来时,我需要能够找出哪个 Player 属于一个套接字,因为我想将动作权威地发送给客户端。为此,当涉及到它包含哪个 playerId 时,我不需要给客户端任何控制权,因为如果我让客户端告诉服务器,我们可以让其他玩家随机移动。
我想到的唯一方法就是这样,但似乎效率不高。
for(var i in connectedPlayers) {
if(conntectedPlayers[i].getSocket() == socket) {
// do stuff
}
}
编辑:根据 cmets 的请求添加整个 sockets.on('connection')。
socketIO.sockets.on('connection', function(socket) {
console.log("Connection maid.");
socket.on('login', function(json) {
sqlConnection.query('select * FROM Accounts', function(err, rows, fields) {
if(err) throw err;
for(var row in rows) {
if(rows[row].Username == json.username) {
var playerId = Math.floor(Math.random()*(50000-1+1)+1);
var player = new Player(playerId, "Guest"+playerId, socket);
connectedPlayers[playerId] = player;
}
}
});
});
socket.on('move-request', function(json) {
socket.emit('move-request', {x: json.x, y: json.y, valid: true});
});
});
【问题讨论】:
-
socket连接时的代码在哪里?通常,您只需在可以访问其他数据的闭包中执行此操作,并将接收数据的其他函数也放入其中。或者,您也可以将任何您想要的属性添加到
socket对象,以便为您识别它。不需要单独的哈希。 -
@jfriend00 - 我把它加到了底部。
-
那么,您的问题是想知道消息到达服务器还是客户端时是哪个播放器?
-
@jfriend00 - 我想知道消息到达服务器时是哪个玩家,而不需要从客户端发送任何信息。我想找到与套接字关联的播放器。
标签: javascript node.js sockets socket.io