2013-02-10 38 views
0

我正在研究严格的基于JavaScript的游戏。我想要的是将特定位的信息定期打印到屏幕上。够简单吗?是的......但问题是,我只想延迟一些文本打印到屏幕上的方式(将文本添加到div的innherHTML中)。如何在指定的时间内延迟所有脚本?

我知道setInterval和setTimeout方法,但问题在于它只能延迟多长时间才能调用某个函数,而脚本的其余部分仍会继续运行。我想要的是让所有的东西都暂停一下,不让javascript进步,直到一段时间过去。

我可以想到一个解决方法 - 不是直接写入innerHTML属性,而是写入字符串队列,然后使用setInterval方法在队列中有任何内容等待时显示一行文本。不难做,但我想知道,如果JavaScript有任何停顿 - 所有的命令将做同样的事情。现在我正在避免jQuery。

谢谢!

+0

有没有像在JS。使用队列似乎是一个不错的选择。 – 2013-02-10 21:33:28

+1

如果代码是以模块化方式编写的,那么当您可以暂停将消息插入div的方法时,为什么需要暂停整个脚本? 也许你应该重新考虑一些架构选择:) – amhed 2013-02-10 21:35:37

回答

1

不,没有这样的事情。 Javascript是异步的,你不能阻止其他“线程”。你可以做的是有一些全局变量或主程序类的方法来停止游戏过程。
简单pauseable游戏类:

function Game() { 
    var run = true; 
    this.pause = function() { 
     run = false; 
    } 
    this.go = function() { 
     if(run) 
      return false; 
     run = true; 
     heartbeat(); 
    } 
    function heartbeat() { 
     /*Do game rendering or whatever you want to pause*/ 

     if(run) 
     setTimeout(heartbeat, 100); //tick 
    } 
} 
+0

感谢您的建议!在这种情况下,我没有使用暂停按钮。我的比赛是一种排序匹配的比赛,在这种比赛中,玩家只有很短的时间才能记住一小段符号,然后再回过头来。我可以用黑色的div来掩盖屏幕上的所有内容,但我不认为这是必要的。 – user1433070 2013-02-10 22:23:52

+0

我可以看看你的游戏吗?我有点好奇。 – 2013-02-10 22:32:42

0

可以“冻结”页面本身的东西,如:

var start = new Date().getTime(), delay = 5000; // milliseconds 
while(new Date().getTime() < start+delay) {} 

然而,这将冻结整个浏览器也是一样,通常会导致崩溃的浏览器, Windows中的“无响应”框或“这个脚本需要很长时间才能运行,杀死它?”题。

做到这一点的“正确”方法是创建一个“isPaused”布尔值,您可以打开或关闭,如果关闭,则函数会尝试再次运行自己。事情是这样的:

function pauseCheck(thisobj,argobj) { 
    if(isPaused) { 
     setTimeout(function() {argobj.callee.apply(thisobj,Array.prototype.slice(argobj,0));},250); 
     return false; 
    } 
    return true; 
} 

然后在您的其他功能:

function doSomething(x,y) { 
    if(pauseCheck(this,arguments)) { 
     // function body here 
    } 
} 
+0

这是一个有趣的解决方案,当你想避免OOP。与被调用者的良好工作:) – 2013-02-10 22:14:44