web-dev-qa-db-ja.com

JavaScriptで「スクリプトループ」を設計する

JavaScriptはシングルスレッド言語ですが、ポイントアンドクリックのアドベンチャーゲームを開発する場合、レンダリング/ロジックスレッドとゲームスクリプトスレッドの2つの「スレッド」を実行すると便利なことがよくあります。

レンダリング/ロジックスレッドはすべてのゲームループを実行してシーンをレンダリングし、キャラクターを移動します。

「スクリプト」スレッドは、ゲームメーカーが対話をスクリプト化するためのシンプルなインターフェースです。アドベンチャーゲームスタジオでは、スクリプトは次のようになります。

_function onRoomLoad() {
    myCharacter.Walk(200,300); // Walk to a point on the screen
    myCharacter.Say("I'm selling these fine leather jackets"); // Say a line of dialogue
    myCharacter.Walk(100,300); // Walk back to where they came from
}
_

これらの関数はすべて、スクリプトスレッドが完了するまでスクリプトスレッドを「ブロック」し、レンダリングスレッドをブロックしている間しない必要があります。

Javascriptでは、これを処理する方法について3つの可能性を見ることができます:

ジェネレーターはどこでも機能します。

_function* onRoomLoad() {
    yield* myCharacter.walk(200,300);
    yield* myCharacter.say("I'm selling these fine leather jackets");
    yield* myCharacter.Walk(100,300);
}
_

(これらすべての収量は最終的にyield* wait(t)呼び出しに要約され、終了する前にtゲームループを待機します。)

約束

_function onRoomLoad() {
    myChar.walk(200,300).
        then(x => x.say("I'm selling these fine leather jackets")).
        then(x => x.walk(100,300));
}
_

ブロッキング呼び出し内のレンダリングを延期する

これは常にブラウザーをブロックするため、これが実際に可能かどうかはわかりませんが、基本的には、可能な限りcanvas要素に描画される無限のwhileループを持つ通常のゲームループと同じように機能します。ブラウザが制御を譲らず完全に制御していなければ、おそらくサイトはクラッシュしたと思うでしょう。

質問

これらの解決策はどれも、私にとって特に満足のいくものではないようです。 ブラウザでスクリプトの動作を任意にブロックできる、見逃したオプションはありますか?

7
Steve

Webワーカーは、メインスレッドをブロックせず、メッセージ/イベントを介して通信するバックグラウンドスレッドを許可します。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

1
jhyot

私はあなたがやろうとしていることを達成するために、ポリモーフィックなコーディング手法を実装します。このようにして、2つの基本クラスを作成し、それらのクラスをサブクラスに継承して、プログラム全体でフレームを徐々に変更することができます。次に、前の関数がユーザーによって指定された他の変数に依存して完了した後、各サブクラスをステップ実行するasync関数を実装すると、基本的にユーザーのアクションに応答し、それに応じてその情報を処理するプログラムができます。私はあなたの質問を正しく理解したと思います。

0
AlyssaFox