1

私は、Objective-C の iPhone アドベンチャーである Scarlett と Spark of Lifeの基礎となる「ストーリー エンジン」を、 CoffeeScript を使用して 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 で禁止されていた頃のことです) では、2 つのスレッドを持つことでこれを実現しました。メイン スレッドは、すべての OpenGL 呼び出し、アニメーション、およびその他の cocos 機能を処理する cocos2d-phone を実行しました。「ストーリー」スレッドはストーリーのコマンド アンド コントロールを処理し、必要に応じてスレッドはスリープNSConditionし、関数から戻る前に待機して次の呼び出しに進みます。

ぎこちなく聞こえるかもしれませんが、通常の見た目のコードを使用するだけで、ストーリーのコマンドと条件を連続した自然な方法で表現することができました。上記の例では、関数の開始時ではなく、Scarlett が何かを言う直前にif変数のチェックが評価されることに注意してください。また、、、および呼び出しは、関連するアニメーション、遅延、またはテキスト ボックスがメイン スレッドで終了するまで返されません。interestingwalkTo()turnTo()wait()think()

私が苦労しているのは、Web テクノロジーを使用してこの表現力を実現する方法です。私が見ているように、私のオプションは次のとおりです。

  1. ストーリーの「スレッド」としてWeb Workerを使用する。しかし、私が知る限り、ワーカーは眠ることができず、状態が共有されていないため、忙しい待機を実行することもできません。
  2. コールバック チェーンを使用して、おそらく IcedCoffeeScript のキーワードawaitdeferキーワードを利用して、コードを整理します。ただし、それらを使用しても、余分なライン ノイズが多くなります。
  3. どういうわけか、ストーリー スクリプトのを 1 つずつ文字列として評価します。非常に問題があると感じずにはいられません。
  4. (いくつかの点で 3 に似ています。)必要に応じてプログラム カウンターを停止および開始できる、特別に設計されたインタープリター言語でストーリー コマンドを記述します。これは不必要に車輪を再発明しているようです。

ただし、本当に明白な解決策を見落としているように感じずにはいられません。どういうわけか、私はこれを前後から見ていますか?山ほどのコールバックなしで、実際のコードを使用してシーケンシャルなアクションと条件文を時間をかけてスクリプト化するための認められたパターンはありますか?

4

0 に答える 0