Akka FSM уведомление о превышении времени

Я занимаюсь разработкой игры, в которой самой игровой логикой / состоянием управляет актер из FSM Акка. Одно из моих состояний WaitingForAnswer и бизнес-логика, связанная с этим состоянием, заключается в том, что игрок (также актер) должен ответить в течение 20 секунд, в противном случае он / она теряет очко. Итак, я определил состояние следующим образом:

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

Все идет нормально. Теперь я хочу получить какое-то напоминание - по истечении половины времени ожидания состояния (через 10 секунд) я хочу отправить игроку напоминание, что он должен ответить в ближайшее время.

Мои идеи:

  1. С помощью setTimer(name, msg, interval, repeat) при входе в WaitingForAnswer состояние, установив interval до 10 секунд. Таким образом, мой актер ФСМ получит напоминание, напоминающее ему о том, что он напомнил актеру игрока. Как вы можете видеть это немного... ну не круто.

  2. Используйте планировщик, и как только мой актер FSM войдет в WaitingForAnswer состояние, запланировать сообщение на 10 секунд в будущем с актером игрока в качестве получателя. Конечно, в этом случае я должен был бы удостовериться, что я отменяю запланированное сообщение, когда актер игрока отвечает вовремя.

Есть ли другой, более естественный способ добиться этого? Какой-то крючок? Какой-то способ использования setTimer с другим получателем?

1 ответ

То, как вы объяснили свою проблему, похоже, что ваше состояние WaitingForAnswer на самом деле представляет собой два разных состояния, которые ведут себя совершенно одинаково. Вы можете определить время ожидания состояния до 10 секунд, если игрок отвечает, логика применяется, в противном случае вы выполняете переход состояния в WaitingForAnswerAfterReminder с повторным тайм-аутом состояния 10 секунд, который обрабатывается той же бизнес-логикой, что и предыдущее состояние.

Мне кажется, что вы пытаетесь смоделировать два состояния в WaitingForAnswer: до и после напоминания.

Другие вопросы по тегам