0

ActionScript 3 でローグライク ゲームを作成しようとしています。このジャンルのゲームでは、キャラクターとアイテムが複雑で予測不可能な方法で相互作用するため、ゲーム内の発生の長い連鎖が 1 ターンのスペースで発生する可能性があります。最後の結果の結果であり、前のものが適切にコースを終了する前に発生することがよくあります。このような混乱の最中に、プレイヤーに入力を促す必要があり、他のことが起こる前にすぐに行動する必要があることに気付いたときに、問題が発生するようです。

UI が別のスレッドで実行されていて、プレーヤーが入力を入力でき、現在実行中の関数のスタック全体から戻ることなくそれを受け取ることができる場合、適切な方法は単純に呼び出すことです (関数呼び出し 私はたまたまその中にいる)プレイヤーの入力を待ってからそれに基づいて行動する関数。しかし AS3 では、これは不可能です。戻る前に入力を待機する関数は、プログラムをハングアップさせるだけです。

この種の問題に対して、ユーザーの入力を待ってから作業を再開できるように、操作を細かく分割するのが正しい解決策であると人々は言います。これは素敵で、通常そのような提案で提供される些細な例ではうまく機能しますが、このような場合、予測不可能で、しばしばランダムな出来事が一度に数十の複雑なイベントの連鎖につながる可能性があり、そのどれもが突然必要になる可能性がありますいつでもユーザーの入力を確認できるため、「自分が行っていたことを再開する」という概念は非常に困難な作業のように思えます。

やっていることを突然やめられるように、ゲーム内で発生するすべてのことを、これまでの進行状況など、発生の詳細をすべて記述したデータ構造として保存するしかないのでしょうか。プレイヤーの入力を待ってから、以前の状態を再構築します。どこからでも「get_input」関数を呼び出すだけで好きなように処理できる機能と比較すると、このタスクの面倒さは、私や誰かが AS3 を使用するのを思いとどまらせるのに十分なようです。私は何が欠けていますか?私を狂気にさせない方法はありますか、それとも、AS3 がこの仕事には不適切なツールであるというヒントとしてこれを受け取るべきですか?

4

1 に答える 1

0

データ構造について - はい、あなたは正しくやっていると思います。ユーザー入力の「即時」リクエストについて - どこかに定義された時間量を持っている必要があり、これより短い時間は即時イベントと見なされ、「続行しますか?」の行でユーザー入力を要求するべきではありません。ここで、メインイベントよりも短いイベントをトリガーするイベントが必要です。これは実行できます。AS3 は、このタイプのイベント処理では正常ですが、プレーヤーが入力を提供できるようにするために、 enterFrameリスナーまたはイベントチェーンの処理に使用するプロセスを解放します。したがって、たとえば、次のようにすることができます。

var userInputRequested:Boolean=false;
while (!userInputRequested && (yourEventsToBeProcessed>0)) {
    userInputRequested=processOneTurnOfOneEvent();
}

明らかに、ゲームは一度にイベントを処理できるはずです。たとえば、「キャラクターが鎧を着ている」というイベントなどです。このような長いイベントでローグライクを見たことがあります。さて、このイベントはイベント チェーンにプッシュされ、yourEventsToBeProcessed はゼロではなくなりました。このループは、ゲーム時間のカウントとともに 1 つのドレッシング イベントを処理します (!!! これを見逃すと、大変なことになります。「このクォンタムを処理する最後のイベントに到達したときに、1 クォンタムを進めて、最初のイベントから開始」) イベントが正常に終了するまで、または別のランダムなイベントがポップアップします (「コボルトがビューに入る!」 - ユーザーの入力は必要ないかもしれませんが、「コボルトが攻撃範囲にいます」かもしれません)。基本的に「move your world」というイベントはその連鎖で常に活動しており、ただし、そのループでチェックされるカウンターにはカウントされません。そうしないと、プレイヤーは世界を永遠に待ちます。これで、そのようなイベントがプレーヤーに表示され、「processOneTurnOfOneEvent()」が true を返す場合、ループが終了し、enterFrame リスナーがユーザーに何かを入力する方法を提供し、入力が受信されるまで辛抱強く待ちます。

于 2012-10-05T05:10:22.040 に答える