我的更新功能中有以下代码,每秒调用30次:
// Checking collision between rune and the players:
for(var j = 0; j < this.players.length; j++) {
if(this.checkCollision(this.players[j], this.runes[i])) {
this.runes[i].activate(this.players[j]);
this.runes[i].isHidden = true;
this.runes[i].onDeactivate = function() {
console.log(i);
self.runes.splice(i, 1);
}
}
}
之前我有:
for(var i = 0; i < this.runes.length; i++) ...
self.runes.splice(i,1)对数组没有任何作用...我被设置为某个值。我只是想从符文数组中删除不活跃的符文。任何想法?
答案 0 :(得分:4)
你有两个问题。
首先,在致电onDeactivate
时,i
已达到this.runes.length
,这就是您将在console.log(i)
电话中看到的内容。解决该问题的经典修复方法如下:
(function(i) {
// code that relies on i
})(i);
这将基本上“锁定”i
的值,用于该闭包的内容。
第二个问题是splice
修改了数组,而你并不适应。假设你有三个符文:
[rune_0, rune_1, rune_2]
现在说rune_1
已取消激活,因此调用代码splice(1,1)
将其删除。现在您的数组看起来像:
[rune_0, rune_2]
现在rune_2
已停用,因此会调用splice(2,1)
。这会从数组中删除[2]
元素......但不再存在。
[rune_0, rune_2]
符文仍在那里。
要从数组中删除符文,您可以执行以下操作:
this.runes = this.runes.filter(function(rune) {return rune !== toremove;});
toremove
是你想要的符文。