1

我一直在尝试使用 CoffeeScript 将我的 Objective-C iPhone 冒险Scarlett and the Spark of Life的底层“故事引擎”移植到 HTML5(我正在研究IcedCoffeeScript)。

图形部分可以只在 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 这样的脚本语言在 App Store 上被禁止时,这又回来了),我们通过两个线程来实现这一点。主线程运行 cocos2d-phone 来处理所有的 OpenGL 调用、动画和其他 cocos 细节。“故事”线程处理故事的命令和控制,如果有必要,线程会休眠,NSCondition在从函数返回并继续进行下一个调用之前等待一个。

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

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

  1. 使用Web Worker作为故事“线程”。但是,据我所知,工作人员无法入睡,并且未共享状态,因此他们甚至无法执行忙碌的等待。
  2. 使用回调链,可能利用 IcedCoffeeScriptawaitdefer关键字来保持代码整洁。但是,即使有这些,也会产生很多额外的线路噪音。
  3. 不知何故,将故事脚本中的行逐一评估为字符串。我不禁觉得这将是一个很大的问题。
  4. (在某些方面类似于 3。)用专门设计的解释语言编写故事命令,其中程序计数器可以根据需要停止和启动。这似乎是在不必要地重新发明轮子。

不过,我不禁觉得我忽略了一些非常明显的解决方案。不知何故,我在看这个从后到前的东西吗?是否有一种公认的模式来使用实际代码编写顺序动作和条件脚本,而无需大量回调?

4

0 回答 0