我正在将旧游戏从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
}
}
答案 0 :(得分:1)
简短的回答是“不。”
更长的答案是,对于“网络工作者”(HTML5的一部分),您可以做到这一点,因为它允许您将游戏逻辑放在一个单独的线程上,并使用消息传递来推送密钥。用户输入游戏线程。但是,您需要以另一种方式使用消息传递,以便能够实际显示输出,这可能无法很好地执行。
答案 1 :(得分:0)
有一个等待用户输入的标志。
var isWaiting = false;
然后检查do_something
中该标志的值(显然在必要时设置它:))。
if (isWaiting) return;
您可能希望在调用堆栈中调用更高的值(调用do_something()
?),但这是您需要的方法。