我正在使用nodejs来创建游戏。碰巧这次我无法使用删除。它不起作用,我不明白为什么。
我执行此行:
delete Bullet.list[i]
Bullet.list
是一个具有属性的对象,执行此行后,不会删除所需的属性。
这是我的代码(您可以在下面的上下文中看到上面的代码行):
var Map = require("./Map.js")
var Player = require("./Player.js");
var Bullet = require("./Bullet.js");
var Fly = require("./Fly.js");
var Settings = require("./Settings.js");
var Simulation = function(SOCKET_LIST){
//Update Bullets
for(var i in Bullet.list){
var bullet = Bullet.list[i];
bullet.update();
var shooter = Player.list[bullet.parent];
//Bullets collide with flies
for(var i in Fly.list){
var fly = Fly.list[i];
if(!bullet.toRemove && bullet.getDistance(fly) < 15){
if(shooter){
shooter.updateCoins(fly.killCoins);
shooter.updateXp(fly.killXp);
}
bullet.toRemove = true;
fly.toRemove = true;
}
}
//Collide with player
for(var i in Player.list){
var player = Player.list[i];
if(player.death) continue;
if(!bullet.toRemove && bullet.getDistance(player) < 32 && shooter !== player.id && shooter.team != player.team && !player.immune){
player.hp -= 1;
player.hpChanged = true;
if(player.hp <= 0){
if(shooter)
player.kill(shooter);
else
player.kill();
}
bullet.toRemove = true;
}
}
//Collide with map
if(typeof shooter == "undefined" || shooter.shootsCollideMap && Map.isColliding(bullet))
bullet.toRemove = true;
//Remove bullets
if(bullet.toRemove){
delete Bullet.list[i]; /*HERE IS THE PROBLEM. THE PROPERTY IS NOT BEING DELETED*/
Bullet.removePack.push[bullet.id];
}
}
我无法从对象Bullet.list中删除属性“i”。
答案 0 :(得分:2)
您的三个for
循环都共享相同的变量i
,因此您不会删除您想要的i
索引。这是因为var i
是函数作用域,而不是作用于单个for
循环。
执行此操作时:
delete Bullet.list[i];
i
的值是i
在您之前的for
循环之后的任何内容,可能不是您实际要删除的项目。也许您的意思是先退出for
循环,以便i
成为您要删除的特定项目?
或者您需要单独将另一个变量保存为要删除的项目的索引。或者,当for
的值为最新值时,只需删除i
循环中的项目。
请记住var
是功能范围的。因此,两个嵌套var i
循环中的for
声明实际上都是引用完全相同的变量,而不是声明一个新变量。我建议将两个循环中的一个循环索引的名称更改为单独的变量。
如果您在完全支持let
的环境中运行,则可以使用let i
代替var i
,然后将i
的值唯一作用于只有声明它的for
循环。
答案 1 :(得分:-1)
删除数组元素时,数组长度不受影响。即使您删除了数组的最后一个元素,这也成立。
您可以尝试使用Bullet.list.splice(i, 1)
作为delete
的替代方案。
此代码中有很多内容,希望这有帮助!