2016-07-19 8 views
0

私はビルド、破壊、生存を含むjavascriptのゲームに取り組んでいます。 これはうまくいきましたが、ツリーを追加した後、ブロックを破った後、ゲームはランダムにフリーズします。 コードはここにある:jsゲームがエラーフリーズ

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); 
        } 
       } 
      } 
     } 

私はそこに無限ループすることと、それが発生したときにエラーが表示できなかったどのような方法が表示されません。

EDIT

私は

  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); 
      } 

にコードを変更しますが、ブロックを破るしようとしたとき、それはまだランダムにフリーズします。

+2

'.splice(...)'を使って 'blocks'(配列/リスト?)を変更していますが、反復処理中です。これは問題を作成するためにバインドされています... – ochi

+0

ありがとうございます。私は修正を試みます。 – infiniscriptr

+0

コンソールにエラーが表示されますか? – ochi

答えて

1

反復処理中に配列(スプライスを使用)を変更すると、問題が発生する可能性があります。配列からブロックblを削除してから、それを続けて実行すると、カウンタはおそらくオフになります。

代わりに、削除しているブロックのインデックスを保存し、ブロックをループした後に削除してください。

+0

)。私の編集を参照してください。 – infiniscriptr

関連する問題