0

ゲームのロジック/状態自体が Akka FSM アクターによって管理されるゲームを開発しています。私の状態の 1 つは、WaitingForAnswerこの状態に関連するビジネス ロジックは、プレーヤー (俳優でもある)は20 秒以内に応答する必要があるというものです。だから私はこのように状態を定義しました:

when(WaitingForAnswer, 20 seconds) {
    // event handling logic here
}

ここまでは順調ですね。ここでやりたいことは、何らかのリマインダーを用意することです。状態タイムアウトの半分が経過した後 (10 秒後)、プレーヤーにリマインダーを送信して、すぐに回答する必要があることを伝えたいと考えています。

私のアイデア:

  1. を10 秒に設定しsetTimer(name, msg, interval, repeat)て状態に入るときに使用します。このようにして、私の FSM アクターは、プレーヤー アクターに思い出させることを思い出させるリマインダを受け取ります。ご覧のとおり、これは少し...まあクールではありません。WaitingForAnswerinterval

  2. スケジューラーを使用して、私の FSM アクターがWaitingForAnswerステートに入ったら、プレーヤー アクターを受信者として、10 秒先のメッセージをスケジュールします。もちろん、この場合、プレーヤー アクターが時間内に応答したときに、スケジュールされたメッセージをキャンセルする必要があります。

これを達成するための他のより自然な方法はありますか? 何かのフック?setTimer別の受信者で使用する方法はありますか?

4

1 に答える 1

1

あなたが問題を説明した方法では、あなたの状態WaitingForAnswerは、実際には非常によく似た動作をする 2 つの異なる状態のようです。状態タイムアウトを 10 秒に定義できます。プレーヤーが応答した場合はロジックが適用されます。それ以外の場合は、前の状態と同じビジネス ロジックによって処理される 10 秒の状態タイムアウトでWaitingForAnswerAfterReminderへの状態遷移を行います。

私には、WaitingForAnswer内で 2 つの状態をモデル化しようとしているように見えます: リマインダーの前後です。

于 2016-03-27T14:26:41.017 に答える