Javascript拼接更改数组中的早期值

时间:2014-04-20 18:43:03

标签: javascript arrays splice

我正在创建一个随机在画布上显示圆圈的游戏。圆形对象被添加到一个数组中,每当玩家与其中一个碰撞时,我想删除该对象。这是我目前用于碰撞的代码 -

    for(var i = 0; i < currentGame.items.length; i++)
    {
        if (player1.x < currentGame.items[i].x + currentGame.items[i].radius*2  && player1.x + currentGame.items[i].radius*2  > currentGame.items[i].x &&
                player1.y < currentGame.items[i].y + currentGame.items[i].radius*2 && player1.y + player1.car.height > currentGame.items[i].y) {
            currentGame.score++;
            position = currentGame.items.indexOf(i);
            currentGame.items.splice(position, 1);
        }
    }

当玩家点击已添加到数组/画布的最后一个圆圈时,此代码可以正常工作。但是,如果玩家击中阵列中间的圆圈,那么阵列的所有子后续项目也将被删除(而不是之前的那些)。球员得分将增加,但许多圈子被删除。这表明当其中一个圆被移除时,项目向下移动并取代刚刚删除的项目,包括获取它的位置坐标,然后玩家与所有这些项目发生碰撞,然后它们全部被删除。

我不知道如何解决这个问题,或者我是否错误地使用了拼接。

这是我添加到数组的代码 -

function createItem(){
    item1 = new itemSmall();
    item1.x = Math.floor(Math.random()*((currentGame.windowWidth - 40)-40+1)+40);
    item1.y = Math.floor(Math.random()*((currentGame.windowHeight - 40)-40+1)+40);
    item1.fillStyle = "rgb(200,80,200)";
    item1.lineWidth = 4; //Stroke Thickness
    item1.strokeStyle = "rgb(255,215,0)";

    currentGame.items.push(item1);
}

项目存储在此处(为清楚起见,我从此对象中删除了其他所有内容) -

function gameValues(){
    this.items = [];
}
currentGame = new gameValues();

1 个答案:

答案 0 :(得分:0)

修改正在循环的数组时遇到麻烦是很常见的。

例如,如果您移除位置i处的项目,则后面的项目将向左移动,因此下一个项目现在将位于i位置,但因为您的循环的下一次迭代检查i+1,该项目将被跳过!

现在你可以在拼接之后做i--;,以确保在下一次迭代中检查位置i中的新项目,但更简单的解决方案就是向后循环。然后影响列表其余部分的操作不会成为问题。

for(var i = currentGame.items.length; i--; )

无论如何,我对您的代码中的其他内容感到担忧:

        position = currentGame.items.indexOf(i);

我们不知道当前项目的位置是i吗?此indexOf会在列表中搜索包含 i的项目。我认为当position搜索失败时,-1将获得值indexOf。我想你在这里的意思是:

        var position = i;

最后,如果您不喜欢console.log,可以尝试将其放入if块中:

        debugger;

在代码中手动设置断点,因此您可以检查变量的值以查看出错的地方。您需要打开浏览器的调试器或“开发工具”面板。完成后别忘了删除声明!