我使用stateless4j作为我的应用程序的有限状态机库,但我不知道如何在触发触发器时使用参数。我有以下代码:
gameFSM.Configure(GameState.LOOKING_FOR_A_QUEST)
.OnEntry(Actions.lookForQuest)
.Permit(GameTrigger.QUEST_FOUND, GameState.JUDGING_QUEST);
gameFSM.Configure(GameState.JUDGING_QUEST)
.OnEntry(Actions.judgeQuest)
.Permit(GameTrigger.QUEST_ACCEPTED, GameState.INACTIVE) /* test */
.Permit(GameTrigger.QUEST_DENIED, GameState.LOOKING_FOR_A_QUEST);
gameFSM.Configure(GameState.INACTIVE)
.Permit(GameTrigger.START_LOOKING_FOR_QUESTS, GameState.LOOKING_FOR_A_QUEST);现在,我正在尝试为从LOOKING_FOR_A_QUEST到QUEST_ACCEPTED的转换创建一个参数。我尝试了以下几点:
TriggerWithParameters1<Quest, GameState, GameTrigger> twp = gameFSM.SetTriggerParameters(GameTrigger.QUEST_FOUND, Quest);但是我不仅不知道以后如何使用这个触发器,而且我也不知道我用这个片段创建了什么。有人能告诉我如何使用参数(如gameFSM.trigger(GameTrigger.QUEST_FOUND, new Quest()); )来创建和触发触发器吗?谢谢!
奖励:为什么StateMachine类中的每个方法都会抛出可疑的、毫无头绪的Exception?我觉得这个图书馆很流畅,但使用起来却很糟糕。有什么建议吗?
发布于 2014-08-31 21:34:11
看来你遇到了和我一样的挫折。通过执行以下操作,我能够传递参数:
TriggerWithParameters1 twp = sm.setTriggerParameters(Trigger.D, java.util.Map.class);
sm.configure(State.D).permit(Trigger.A, State.A)
.onEntryFrom( twp, new Action1<Map>(){
public void doIt(Map m) {
System.out.println(m.toString());
}
}, Map.class);
Map data = new HashMap();
data.put("a", "1");
sm.fire(twp, data);这种方法似乎过于复杂,但确实有效。
发布于 2020-12-09 17:38:28
如果使用permitDynamic窗体代替permit,则可以使用参数化操作。
TriggerWithParameters1 twp = sm.setTriggerParameters(Trigger.D, java.util.Map.class);
sm.configure(State.D)
.permitDynamic(
twp,
(m) -> State.A,
(m) -> System.out.println(m.toString())
);
Map data = new HashMap();
data.put("a", "1");
sm.fire(twp, data);缺点是您失去了生成点图输出的能力。
https://stackoverflow.com/questions/22181068
复制相似问题