Socket.io node.js Math.random将sprite放在同一个地方,供所有用户使用

时间:2012-12-08 23:05:37

标签: javascript html5 oop node.js socket.io

我正在创建一个多玩家游戏,用户必须收集放在画布上的对象。我需要将这些对象放在每个用户的相同位置。我正在使用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错误。无论如何都要在函数外添加该数组吗?

1 个答案:

答案 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));
});