2010-05-06 42 views
0

嗨,大家好,我是JavaScript新手,我正在做一个项目,为我的决赛在课堂上。我需要做到这一点,所以我操纵的游戏引擎会导致生成按钮无限循环。试图创建一个无限的循环,可以停止使用函数doIt()

我也需要使用(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> 
+0

我在标题中读取函数名称为“dolt”,并认为您尝试是一个有趣的家伙 – 2010-05-06 23:54:17

+0

哈哈,不幸的是不是。辛普森一家还在电视上!? – JoeOzz 2010-05-07 01:57:25

回答

1

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

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

0

我想你想看看this article关于时间延迟。每当JavaScript忙于计算时(包括generate()),它都不响应按钮推送等。你想限制发生的事情。

+0

这篇文章是非常有帮助!然而,而不是使用窗口方法,我可以将此setTimeout附加到onClick? – JoeOzz 2010-05-07 00:16:15

+0

@JoeOzz你可以在标准代码中做任何事情,你可以在onClic中完成k回调 – 2010-05-07 17:24:10

1

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

+0

所以,我的教授给了我们错误的代码,然后...真棒!哈哈,谢谢你们的深刻反应,每个人!我喜欢这个网站! – JoeOzz 2010-05-07 00:16:57

+0

如果generation()通过onClick激活,你将如何去做这件事。我不确定clearTimeout是否可以通过onClick调用,这正是我的教授所期望的。 – JoeOzz 2010-05-07 01:22:58

+0

您不需要清除超时;只需在doIt('var continue = false;')中设置一个全局变量,然后在'generation()'的顶部放入'if(!continue)return;' - 下次调用'generation'时,只是退出,它不会为自己设置另一个超时回调。 – tzaman 2010-05-07 08:49:46