私は、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
変数のチェックが評価されることに注意してください。また、、、および呼び出しは、関連するアニメーション、遅延、またはテキスト ボックスがメイン スレッドで終了するまで返されません。interesting
walkTo()
turnTo()
wait()
think()
私が苦労しているのは、Web テクノロジーを使用してこの表現力を実現する方法です。私が見ているように、私のオプションは次のとおりです。
- ストーリーの「スレッド」としてWeb Workerを使用する。しかし、私が知る限り、ワーカーは眠ることができず、状態が共有されていないため、忙しい待機を実行することもできません。
- コールバック チェーンを使用して、おそらく IcedCoffeeScript のキーワード
await
とdefer
キーワードを利用して、コードを整理します。ただし、それらを使用しても、余分なライン ノイズが多くなります。 - どういうわけか、ストーリー スクリプトの行を 1 つずつ文字列として評価します。非常に問題があると感じずにはいられません。
- (いくつかの点で 3 に似ています。)必要に応じてプログラム カウンターを停止および開始できる、特別に設計されたインタープリター言語でストーリー コマンドを記述します。これは不必要に車輪を再発明しているようです。
ただし、本当に明白な解決策を見落としているように感じずにはいられません。どういうわけか、私はこれを前後から見ていますか?山ほどのコールバックなしで、実際のコードを使用してシーケンシャルなアクションと条件文を時間をかけてスクリプト化するための認められたパターンはありますか?