我正在创建一个多玩家游戏,用户必须收集放在画布上的对象。我需要将这些对象放在每个用户的相同位置。我正在使用socket.io服务器来创建坐标,并使用clientide来绘制精灵:
客户端:
var ShoppingList = function(noItems){
var self = this;
self.list = [];
for(var i = 0; i < noItems; i++){
socket.emit('getPosition', {id: i, gameWidth: Game.width});
socket.on('setPosition', function(data){
self.list.push(new ShoppingListItem(data.id, data.x, data.y));;
//this.list.push(new ShoppingListItem(i));
});
服务器:
socket.on('getPosition', function(data) {
socket.emit('setPosition', {
x: 32 + (Math.random() * (data.gameWidth - 64)),
y: 32 + (Math.random() * (data.gameWidth - 64)),
id: data.id
});
});
但是,从socket.on函数中访问第一个代码块中的ShoppingList会引发null错误。无论如何都要在函数外添加该数组吗?
答案 0 :(得分:1)
您应该从ShoppingList功能中取出socket.on('setPosition', ...)
。你这样做的方式并没有多大意义,因为它只会在函数中监听setPosition事件。这意味着函数将在服务器触发setPosition之前结束,因为在emit事件之后会有一个延迟(无论多小)。而是尝试像
var ShoppingList = function(noItems){
var self = this;
self.list = [];
for(var i = 0; i < noItems; i++){
socket.emit('getPosition', {id: i, gameWidth: Game.width});
}
};
socket.on('setPosition', function(data){
ShoppingList.list.push(new ShoppingListItem(data.id, data.x, data.y));
});