0

我有我的NPC,其构造类似下面的状态机处理事件,在状态机

execute state 
[[[pred1 pred2....] state1] 
[[pred3 pred4....] state2] 
[[pred5 pred6....] staten]] 

会发生什么是当前的状态完成后,它开始通过美国/谓词列表和迭代尽快返回全部为true的谓词列表将跳转到与之相关联的状态。

某些事件可能发生在所有状态,比如玩家命令npc去某个地方。就像任何其他状态转换一样,我可以检查谓词并更改状态,但是将相同的代码添加到每个状态似乎有点跛脚。所以我想知道人们如何处理状态机中的事件?

回答

1

就作出这样的数据结构:

state1 -> event1, event2 
state2 -> event1 
state3 -> event2, event3 

顺便问一下,你所概述什么看起来不像状态机。在状态机,下一个状态依赖于前一个,所以它看起来像:

[state1, condition1] -> state2 
[state1, condition2] -> state3 
... 

(条件是你的谓词集)。您还必须以某种方式确保转换是唯一的,即条件1和条件2不能同时满足。或者采取第一个是真的。

0

如果您可以从所有可能的状态进行特定操作,请按照您在数学中所做的那样操作:将它分解!

即:4 * 10 + 5×10 + 6 * 10 + 4 * 20 + 5 * 20 + 6 * 20 =(4 + 5 + 6)*(10 + 20)

即:你的(遗忘)npc可以在睡觉,工作或吃饭。在所有三种情况下,它必须对某些事件做出反应(被谈论,受到攻击......)。建立两个FSM:每日活动= [睡觉,工作,吃饭]。反应状态:{不受干扰,说话,攻击,...}。然后只将事件转发给第二个FSM

只要您将独立事物分解,您就可以继续保留FSM因式分解。例如,npc(开心,中立,愤怒......)的情绪与日常活动及其反应状态无关。我的意思是“独立”,意思是“全国人民代表大会可以在工作中,谈到和生气,而且没有矛盾”。当然,FSM相互影响,被攻击的NPC往往会生气。

所以,你可以添加第三个FSM的情绪状态,而不是将其掺入在每一个节点

1

尝试使用模式称为“国家” - http://en.wikipedia.org/wiki/State_pattern

定义抽象超类(如类AbsatractState,把那里的方法代码,通用于所有州),各阶级能够代表真实状态,必须从它的子类。

0

使用分层状态机(HSM)。 HSM的设计正是为了将常见的行为分解为超范围,并使其可以重用于所有子状态。要了解有关HSM的更多信息,可以从Wikipedia文章“UML状态机”开始,网址为http://en.wikipedia.org/wiki/UML_state_machine