我正在创建一个随机在画布上显示圆圈的游戏。圆形对象被添加到一个数组中,每当玩家与其中一个碰撞时,我想删除该对象。这是我目前用于碰撞的代码 -
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();
答案 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;
在代码中手动设置断点,因此您可以检查变量的值以查看出错的地方。您需要打开浏览器的调试器或“开发工具”面板。完成后别忘了删除声明!