嵌套循环在函数中被跳过

Nested Loop is skipped within Function

在基本的 HTML/Javascript 游戏中,当我移动我的角色时,我想调整 AI 的移动,因此他们的 speed/position 是相对于角色的,而不是 canvas。我的代码工作正常,但仅适用于最后列出的那个键的功能。

//Left button
if (37 in keysDown) {
  if (robot.x <= 400) {

    //this for statement runs
    for (var i = 0; i < boxes.length; i++) {
        if (boxes[1].x < 0) {
            boxes[i].x += robot.speed * modifier;
            robot.x = 400;

            //this for statement is the problem, doesn't run at all
            for (var j = 0; j < cogs.length; j++) {
                cogs[j].speedX = cogs[j].prevspeedX + robot.speed;
            }   
        };
     };
  };

  //this runs
  robot.x -= robot.speed * modifier;
} else {
  for (var j = 0; j < cogs.length; j++) {
      cogs[j].speedX = cogs[j].prevspeedX;
  }
}; 

然后整个右键运行,因为它在左键之后:

//Right button
if (39 in keysDown) {
  if (robot.x >= canvas.width - 400) {
    for (var i = 0; i < boxes.length; i++) {
        if (boxes[1].x > -3000 + canvas.width) {
            boxes[i].x -= robot.speed * modifier;
            robot.x = canvas.width - 400;

            //this is exactly identical to above, only robot.speed is subtracted
            for (var j = 0; j < cogs.length; j++) {
                cogs[j].speedX = cogs[j].prevspeedX - robot.speed;
            }
        }; 
    };
  };
  robot.x += robot.speed * modifier;
} else {
    for (var j = 0; j < cogs.length; j++) {
      cogs[j].speedX = cogs[j].prevspeedX;
    }
};

据我所知,这不是任何变量或值的问题,因为当我切换 right/left 函数的顺序时,左边开始工作,右边停止。

完整代码:http://codepen.io/anon/pen/NqxbBX

编辑:澄清一下,问题不是我的代码在我按下向左箭头 (37) 时不起作用,播放器和盒子移动部分都很好。 (keysDown 是一个对象而不是数组)只有影响齿轮移动的部分 当玩家向左移动时 不起作用。按下右键时运行的几乎相同的代码完全按预期工作......这就是为什么它一直让我精神错乱。

我什至会胡乱猜测解决问题的方法!

问题是条件

if (boxes[1].x < 0) {

if (boxes[1].x > -3000 + canvas.width) {

地板的(boxes[1])初始x值是0,因此它不会通过左键逻辑中的if条件。

如果你做到 if (boxes[1].x <= 0) {if (boxes[1].x >= -3000 + canvas.width) {,它应该可以正常工作。

之所以把右键逻辑放在左键逻辑切换哪个起作用之前是因为右键逻辑改变了boxes[1].x的值,使其满足boxes[1].x < 0.

问题不存在于您的 for 循环中,而是存在于您的 if else 结构中。

当您注意到底部的内容 运行 很好,但顶部的内容却不行时,您就接近了答案。这是因为如果您的顶部 if 语句被捕获,则底部的 else 语句会取消齿轮的移动。做类似下面的事情(仍然有一些错误,请注意),将起作用:

http://codepen.io/anon/pen/ZGQPzw

我还注意到的一件事是,如果您的机器人撞到墙上,齿轮会继续加速,即使 "box" 本身没有。

顺便说一句,不以分号结尾的 if else 语句也是一种很好的形式,因为分号是不必要的。