2016-03-27 16 views
0

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

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

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

Мои идеи:

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

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

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

ответ

1

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

Для меня это выглядит так, что вы пытаетесь моделировать два состояния в пределах WaitingForAnswer: до и после напоминания.

+0

Спасибо, Josep. Я фактически просмотрел вашу презентацию об Game Dev с Akka :) Во всяком случае, я закончил реализацию напоминания на стороне клиента, поскольку требование немного изменилось, но в целом мне нравится ваша идея! – Anton

+0

Рад, что вам понравилось! –