我可以中断javascript代码然后继续按键吗?

时间:2010-06-12 16:18:05

标签: javascript events

我正在将旧游戏从C移植到Javascript。我遇到了显示代码的问题,我希望主要的游戏代码调用显示方法,而不必担心这些状态消息的显示方式。

在原始代码中,如果消息太长,程序只等待播放器用空格键切换消息,然后继续。这在javascript中不起作用,因为当我等待事件时,所有其他程序代码继续。我曾经想过使用一个回调,以便当玩家点击指定的键时可以执行更多的代码,但是我无法看到在整个代码中分散了大量display.update(msg)的调用是如何可行的。

我能否以不同的方式构建事物,以便基于事件的异步模型有效,或者是否有其他解决方案可以让我实现更传统的事件循环?

我有道理吗?

示例:

// this is what the original code does, but obviously doesn't work in Javascript
display = {
    update : function(msg) {
          // if msg is too long
          //     wait for user input
          // ok, we've got input, continue
    }
};


// this is more javascript-y...
display = {
    update : function(msg, when_finished) {
          // show part of the message

          $(document).addEvent('keydown', function(e) {
               // display the rest of the message

               when_finished();
          });
    }
};
// but makes for amazingly nasty game code
do_something(param, function() {
    // in case do_something calls display I have to 
    // provide a callback for everything afterwards

    // this happens next, but what if do_the_next_thing needs to call display?
    // I have to wait again
    do_the_next_thing(param, function() {
        // now I have to do this again, ad infinitum
    }
}

2 个答案:

答案 0 :(得分:1)

简短的回答是“不。”

更长的答案是,对于“网络工作者”(HTML5的一部分),您可以做到这一点,因为它允许您将游戏逻辑放在一个单独的线程上,并使用消息传递来推送密钥。用户输入游戏线程。但是,您需要以另一种方式使用消息传递,以便能够实际显示输出,这可能无法很好地执行。

答案 1 :(得分:0)

有一个等待用户输入的标志。

var isWaiting = false;

然后检查do_something中该标志的值(显然在必要时设置它:))。

if (isWaiting) return;

您可能希望在调用堆栈中调用更高的值(调用do_something()?),但这是您需要的方法。