在CoffeeScript中重写线程化Objective-C“故事引擎”:如何在没有大量回调的情况下按顺序编写动作和条件脚本?

在CoffeeScript中重写线程化Objective-C“故事引擎”:如何在没有大量回调的情况下按顺序编写动作和条件脚本?,objective-c,html,callback,coffeescript,iced-coffeescript,Objective C,Html,Callback,Coffeescript,Iced Coffeescript,我一直在尝试使用CoffeeScript将我的Objective-C iPhone冒险的底层“故事引擎”移植到HTML5,我正在研究 图形部分可以只在DOM上使用div——那里的要求相当简单。有问题的部分是“命令和控制”故事类型的命令。理想情况是能够表达高级故事命令(包括条件),并按顺序执行它们。例如,在faux CoffeeScript中: scarlett.walkTo(200,300) scarlett.turnTo(0) story.wait(0.8) if interesting

我一直在尝试使用CoffeeScript将我的Objective-C iPhone冒险的底层“故事引擎”移植到HTML5,我正在研究

图形部分可以只在DOM上使用div——那里的要求相当简单。有问题的部分是“命令和控制”故事类型的命令。理想情况是能够表达高级故事命令(包括条件),并按顺序执行它们。例如,在faux CoffeeScript中:

scarlett.walkTo(200,300)
scarlett.turnTo(0)
story.wait(0.8)

if interesting
  scarlett.think('Looks interesting.')
else
  scarlett.think('Looks boring.')
在Objective-C中,像Lua这样的脚本语言在应用商店中被禁止时,我们通过两个线程实现了这一点。主线程运行cocos2dphone,处理所有OpenGL调用、动画和其他cocos细节。“story”线程处理story的命令和控制,如果需要,线程将休眠,等待NSCondition,然后从函数返回并继续下一个调用

这听起来很尴尬,但它允许我们以顺序、自然的方式表达故事命令和条件,只需使用外观正常的代码。请注意,在上面的示例中,对感兴趣的变量的if检查将在Scarlett说话之前进行计算,而不是在函数的开头。此外,walkTo、turnTo、wait和think调用将不会返回,直到其关联的动画、延迟或文本框在主线程上完成

我正在努力解决的是如何使用web技术实现这种表现力。在我看来,我的选择是:

使用Web Worker作为故事“线程”。然而,据我所知,工作人员无法睡眠,并且状态不共享,所以他们甚至不能执行繁忙的等待。 使用回调链,可能利用IcedOfficeScript的wait和defer关键字来保持代码整洁。尽管如此,这还是有很多额外的线路噪音。 以某种方式将故事脚本中的一行一行作为字符串进行计算。我忍不住觉得这将是一个很大的问题。 在某些方面与3类似。用专门设计的解释语言编写故事命令,程序计数器可以根据需要停止和启动。这似乎是不必要的重新发明车轮。
不过,我还是忍不住觉得自己忽略了一些显而易见的解决办法。不知怎的,我是不是在背对背地看这个?是否有一种公认的模式,可以使用实际代码编写随时间推移的连续动作和条件脚本,而不需要大量回调?

您可以使用series或瀑布。感谢您提醒我注意这些。瀑布法看起来可能工作得很好,即使它是一种比我更喜欢的“联合”方法。我会在附近玩一玩,让你知道我进展如何。