0

嘿伙计们,我是 javascript 的新手,我正在为我的期末考试做一个项目。我需要这样做,所以我操纵的这个游戏引擎会导致生成按钮进入无限循环。

我还需要使用 (Reset==1) 停止它。有什么帮助吗?如果有帮助,这是我到目前为止的代码:

function generation()
{

 for(y2=0; y2<2500; y2++) 
 {
  tempmapactual[y2]=mapactual[y2];
 }

 for (g=0;g<2500;g++)
 {
  neighbours=0;
  for (h=0;h<8;h++)
  {
   if (g+coords[h]>0 && g+coords[h]<2499 && mapactual[g+coords[h]]=="white.gif") 
   {neighbours=neighbours+1;} 
  }
  if (neighbours>=4 || neighbours==1 || neighbours==0) 
   {tempmapactual[g]="black.gif";}

  if (neighbours==3) {tempmapactual[g]="white.gif";}
 }

 for(y3=0; y3<2500; ++y3) 
 {
  if (mapactual[y3]!=tempmapactual[y3])
  {
   mapactual[y3]=tempmapactual[y3];
   document.images[y3+offset].src=mapactual[y3];
  }
 }

} 




</script> 

<script>
function doIt()
{
   for (i=0; i<X; i++)
  {
    // This is where I have trouble. What part of generation() do I call?
  }

     if (Reset==1) break; // This will kill the loop instantly.
  }
}
</script>

<script>
window.onload(doIt($(X).value)));
</script>


<form> 
<input type="button" value="generate" onClick="generation();"> 
</form>

<form>
<input type="text">
</form>

<form>
<input type="button" value="Infinite Loop!" onclick="doIt();"> 
</form>

<form>
<input type="button" value="Reset" onclick="doIt();">
</form>
4

3 回答 3

1

你不能从另一个没有线程的函数中跳出已经运行的无限循环;但是您可以采取稍微不同的方法:如果您的“无限循环”是通过运行一次迭代的函数发生的setTimeout,然后在间隔后使用回调再次调用自身,那么它将“连续”运行,同时仍然是可中断的(比如说,在你的doIt函数中设置一些全局标志变量,它generation可以检查它何时被调用,如果为真则退出。

于 2010-05-07T00:04:10.733 回答
1

JavaScript 不是多线程的,你不能轻易跳出无限循环。大多数浏览器/JavaScript 会检测到失控的旋转并终止执行。

如果您正在编写游戏引擎,更好地利用 CPU 周期是设置计时器。这样您就可以在不再需要时停止计时器。

于 2010-05-06T23:57:15.433 回答
0

我想你想看看这篇关于时间延迟的文章。每当 JavaScript 忙于计算(包括 with generate())时,它对按钮按下等都没有响应。你想限制这种情况发生的程度。

于 2010-05-07T00:04:06.753 回答