0

ユーザーがキャンバスに配置されたオブジェクトを収集する必要があるマルチプレイヤー ゲームを作成しています。これらのオブジェクトを各ユーザーの同じ位置に配置する必要があります。socket.io サーバーを使用して座標を作成し、クライアント側を使用してスプライトを描画しています。

クライアント:

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 エラーがスローされます。関数の外でその配列に追加する方法はありますか?

4

1 に答える 1

1

socket.on('setPosition', ...)ShoppingList 関数から取り出してください。関数内で setPosition イベントをリッスンするだけなので、これを行う方法は実際には意味がありません。これは、サーバーが setPosition をトリガーする前に関数が終了することを意味します。これは、発行イベントの後に遅延が発生するためです (わずかですが)。代わりに次のようなものを試してください

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));
});
于 2012-12-25T20:53:00.650 に答える