我的npcs状态机的结构如下,
execute state
[[[pred1 pred2....] state1]
[[pred3 pred4....] state2]
[[pred5 pred6....] staten]]
当前状态完成后会发生什么,它会开始遍历状态/谓词列表,只要返回全部为true的谓词列表,它就会跳转到与之关联的状态。
某些事件可能发生在所有状态,比如玩家命令npc去某个地方。就像任何其他状态转换一样,我可以检查谓词和更改状态,但是为每个状态添加相同的代码片段似乎有点蹩脚。所以我想知道人们如何处理状态机中的事件?
答案 0 :(得分:1)
只需创建一个数据结构:
state1 -> event1, event2
state2 -> event1
state3 -> event2, event3
顺便说一句,你所概述的内容看起来并不像状态机。在状态机中,下一个状态取决于前一个状态,因此它看起来像:
[state1, condition1] -> state2
[state1, condition2] -> state3
...
(条件是你的谓词集)。您还必须以某种方式确保转换是唯一的,即条件1和条件2不能同时满足。或者拿第一个是真的。
答案 1 :(得分:1)
尝试使用名为“状态”的模式 - http://en.wikipedia.org/wiki/State_pattern
定义抽象超类(例如,类AbsatractState,放置所有状态通用的方法代码),并且所有表示实状态的类都必须从中进行子类化。
答案 2 :(得分:0)
当你有一个可以从所有可能的状态采取的特定行动时,就像你在数学中所做的那样:因素!
即:4 * 10 + 5 * 10 + 6 * 10 + 4 * 20 + 5 * 20 + 6 * 20 =(4 + 5 + 6)*(10 + 20)
即:您的(遗忘)npc可能正在睡觉,或在工作或进食。在所有这三种情况下,它必须对某些事件做出反应(被谈论,被攻击,......)。建立两个FSM:每日活动= [睡觉,工作,吃饭]。反应状态:{Undisturbed,Talked to,Attacked,...}。然后将事件仅转发给第二个FSM
只要您考虑独立的事情,您就可以继续对FSM进行保理。例如,npc(快乐,中立,愤怒......)的情绪与其日常活动及其反应状态无关。我的意思是“独立”,意思是“npc可以在工作,交谈,生气,并且没有矛盾”。当然FSM相互影响,被攻击的npc往往会生气。
因此,您可以为Mood状态添加第三个FSM,而不是将其合并到每个节点
答案 3 :(得分:0)
使用分层状态机(HSM)。 HSM的设计旨在将常见行为分解为超级状态,并使其可重用于所有子状态。要了解有关HSM的更多信息,您可以从http://en.wikipedia.org/wiki/UML_state_machine处的维基百科文章“UML State Machine”开始。