2016-06-21 78 views
0

我正在创建一个多人游戏,并且在javascript中有一个对象,并带有一些键和值。如何从更新中修改对象并删除旧密钥?

该对象被称为玩家,用于保存关于连接到游戏服务器的每个玩家的信息。

name是对象的键,然后该对象的值是一个Player对象保持的信息,如xylevel

不断我向服务器发送一个请求,以获取有关玩家的更新信息。

因为发生这种情况,很多时候,我不希望players对象是每次都重设(players = {}),所以反而,我更新任何信息的对象。

目前我检查if name in players,如果是这样,我更新这样的对象:

players[name].x = x; 
players[name].y = y; 
// etc. 

否则,我只需创建一个新Player对象,以信息,并将其添加到players对象。 (如果连接例如一个新的播放器)

的问题是,如果一个球员已在players不再从服务器更新后的信息(即播放器断开),我怎么去从删除它们物体。

是否有必要循环低谷players,如果玩家不再处于更新信息中,请将其从对象中移除,或者有没有更简单的方法来做到这一点?

如果没有其他方法,重置字典并添加数据是否更好?感觉这并不是做这种简单事情的最佳方式。

这里是我到目前为止的代码:

var newplayers = new info from server; 

for(var i=0; i<newplayers.length; i++) 
{ 
    var pl = newplayers[i]; 

    var name = pl.name; 

    var x = pl.x; 
    var y = pl.y; 
    // etc. 

    if(name in players) 
    { 
     players[name].x = x; 
     players[name].y = y; 
     // etc. 
    } else 
     newplayer = new Player(); 
     newplayer.x = x; 
     newplayer.y = y; 
     // etc. 
     players[name] = newplayer; 
    } 
} 

// What if the player is no longer in the updated info, but still in players? 

所有帮助感激!提前致谢!

+0

请注意,词典在JavaScript中称为对象。 – JJJ

+0

谢谢你让我知道。我以为你可以使用两个名字。我会更新这个问题。 –

+0

由于您正在更新旧玩家的信息并将新玩家添加到旧玩家,那么我们可以简单地设置“玩家=新玩家”我没有看到需要for循环。 –

回答

1

因此,您可以选择从您的players字典中删除过时的数据,或每次从头开始重新构建它?

我认为答案取决于你有多少数据。如果你最多有20名玩家,那么可能无关紧要。如果你有100万玩家,那就不一样了。

如果您想确定,最好的办法是测量它。尝试两种解决方案,让您希望能够处理的玩家人数最多,并查看对性能的影响。

或只是去最简单的实现,看看它是否足够你的目的。在你需要之前没有必要进行优化。

就我个人而言,我只是循环通过players删除过时的数据。如果表现不够好,那么我会优化。

+0

感谢您的咨询!一次可能有多达一百名玩家,但它可能会很好。 –

相关问题