- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,似乎我在拼接后覆盖了数组索引,至少我认为是这样。它适用于使用 Phaser 2 构建的小游戏。它本质上只是一个小型多人跳跃游戏,可以获得一些客户端/服务器架构的经验。正在使用 socket.io 和 express。我的问题似乎出在服务器上,当客户端断开连接时,当它从玩家列表中删除时,仍在游戏中的其他玩家似乎覆盖了断开连接的玩家的索引。为了调试这个,我主要使用控制台日志,使用 for 循环遍历列表并打印出玩家的套接字 ID。因此,例如,如果我使用插槽 ID 1 的玩家 1 加入,然后使用插槽 ID 2 的玩家 2 加入,然后玩家 2 离开,for 循环将打印出 1、1。如果使用插槽 ID 3 的新玩家 3 在玩家之后加入2 已经离开,打印出玩家的 ID 将打印出 1、1、3。起初我认为问题是在 onNewPlayer(data) 函数中,我遇到了别名问题,因为我在两个中使用了 var currentInfo不同的地方,所以我将第二个对象更改为 var info。这似乎是某种别名问题,还是我应该在其他地方搜索此问题?如果需要,我可以提供额外的代码,到目前为止,我们所有关于玩家创建和移动的回调都运行良好。谢谢。
下面是相关的服务端代码
var players[];
//When a new player is made, save it
function onNewPlayer(data) {
var newPlayer = new Player(data.x, data.y, this.id);
var currentInfo = {
x: newPlayer.x,
y: newPlayer.y,
id: newPlayer.id,
};
for(i = 0; i < players.length; i++) {
//broadcast the new player out to all the other players in the list
this.broadcast.emit("newEnemy", currentInfo);
}
//check for if there are already players,
//if so, send the player's who are already in the game to the new player
if(players.length > 0) {
for(i = 0; i < players.length; i++) {
var info = {
x: players[i].x,
y: players[i].y,
id: players[i].id,
};
this.emit("newEnemy", info);
}
}
players.push(newPlayer);
for(i = 0; i < players.length; i++) {
console.log(players[i].id);
}
}
function onDisconnect(){
console.log("User " + this.id + " disconnected");
//find the user in the list of players and remove them, then tell the client
for(i = 0; i < players.length; i++) {
if(players[i].id === this.id) {
console.log("removing this player " + this.id);
//TODO trying a different broadcast
this.broadcast.emit("playerDisconnect", this.id);
console.log(players[i].id);
players.splice(i, 1);
}
}
}
下面是相关的客户端代码
//We've lost connection with the server!
function onSocketDisconnect() {
console.log("Lost connection with server!");
};
//When the server notifies the client an enemy has disconnected,
//search for it in the enemies list and stop rendering it
function onEnemyDisconnect(data) {
//TODO
for(i = 0; i < enemies.length; i++) {
if(enemies[i].id == data) {
//TODO
console.log("destroying");
enemies[i].destroy();
enemies.splice(i, 1);
}
}
}
最佳答案
您正在使用 for
循环在正向迭代一个数组,并使用 .splice()
从数组中删除元素。这将无法正常工作,因为当您调用 .splice()
从数组中删除一个项目时,它会将数组中后面的元素复制到一个位置。但是,您的 for
循环索引指向数组中的下一个元素。最终结果是您跳过了数组中的迭代项。
有多种可能的解决方案。
您可以向后而不是向前迭代数组。当以相反的顺序迭代时,您尚未迭代的元素不受您的 .splice()
的影响,并且它工作得很好。
您可以在 for
循环中停止修改数组。也许您收集了一组要删除的索引,然后从后向前删除它们。
您可以使用 .filter()
创建一个新数组,该数组是原始数组的一个子集,并且在完成 .filter()
操作后只需将新数组分配给您的变量并从那时起使用它。
您可以按原样保持迭代,但在调用 .splice()
后通过将 for
循环索引减一来更正它。
这是反向数组迭代的示例:
// When the server notifies the client an enemy has disconnected,
// search for it in the enemies list and stop rendering it
function onEnemyDisconnect(data) {
// use reverse iteration to avoid skipping elements when calling .splice()
for (i = enemies.length - 1; i >= 0; i--)
if(enemies[i].id == data) {
console.log("destroying");
enemies[i].destroy();
enemies.splice(i, 1);
}
}
}
这是一个 .filter()
示例,假设您可以分配给 enemies
并且新数组将永久取代它:
// When the server notifies the client an enemy has disconnected,
// search for it in the enemies list and stop rendering it
function onEnemyDisconnect(data) {
enemies = enemies.filter(item => {
if (item.id === data) {
console.log("destroying");
item.destroy();
return false; // don't keep this one
}
return true;
});
}
关于javascript - 拼接后Javascript覆盖数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730643/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!