js游戏冻结没有错误

时间:2016-07-19 20:26:55

标签: javascript html5 html5-canvas

我正在开发一个涉及构建,破坏和生存的javascript游戏。 它一直工作正常但是在添加树之后游戏会在打破块之后随机冻结。 代码在这里:

for (var bl in blocks) {
           if (mouse.x >= blocks[bl].x-camera.x && mouse.y >= camera.y+blocks[bl].y && mouse.x <= blocks[bl].x-camera.x+64 && mouse.y <= camera.y+blocks[bl].y+64) {
                document.body.style.cursor = "pointer";
                if (mouse.down) {
                     if (!blocks[bl].d && blocks[bl].d !== 0) {
                          blocks[bl].d = 32;
                     } else if (blocks[bl].d > 0) {
                          blocks[bl].d -= 0.5;
                          if (tools[player.tool].n === 'axe') {
                               blocks[bl].d -= 1;
                          }
                     } else {
                          var fb = false;
                          for (var i in inventory) {
                               if (inventory[i].n === blocks[bl].n) {
                                    inventory[i].a ++;
                                    fb = true;
                               }
                          }
                          if (!fb) {
                               inventory.push({n: blocks[bl].n, a: 1});
                          }
                          blocks.splice(bl, 1);
                     }
                }
           }
      }

我没有看到任何可能存在无限循环的方式,并且当它发生时没有出现错误。

修改

我将代码更改为

          var spliceblock = {bl: 0, s: false};
          for (var bl in blocks) {
               if (mouse.x >= blocks[bl].x-camera.x && mouse.y >= camera.y+blocks[bl].y && mouse.x <= blocks[bl].x-camera.x+64 && mouse.y <= camera.y+blocks[bl].y+64) {
                    document.body.style.cursor = "pointer";
                    if (mouse.down) {
                         if (!blocks[bl].d && blocks[bl].d !== 0) {
                              blocks[bl].d = 32;
                         } else if (blocks[bl].d > 0) {
                              blocks[bl].d -= 0.5;
                              if (tools[player.tool].n === 'axe') {
                                   blocks[bl].d -= 1;
                              }
                         } else {
                              var fb = false;
                              for (var i in inventory) {
                                   if (inventory[i].n === blocks[bl].n) {
                                        inventory[i].a ++;
                                        fb = true;
                                   }
                              }
                              if (!fb) {
                                   inventory.push({n: blocks[bl].n, a: 1});
                              }
                              spliceblock.s = true;
                              spliceblock.bl = bl;
                              //blocks.splice(bl, 1);
                         }
                    }
               }
          }
          if (spliceblock.s) {
               blocks.splice(spliceblock.bl, 1);
          }

但在尝试打破阻挡时它仍会随机冻结。

1 个答案:

答案 0 :(得分:1)

在迭代过程中修改数组(使用splice)必然会导致问题。如果从阵列中移除块bl然后继续运行它,计数器可能会关闭。

相反,存储要删除的块的索引,然后在完成块循环后将其删除。