C ++中的有限状态机


16

因此,我已经阅读了很多有关使用FSM进行游戏状态管理的知识,例如FSM是什么,以及使用堆栈或状态集构建状态。我经历了所有这些。但是,我一直坚持为此目的编写一个经过精心设计的FSM 实际实现。具体而言,一个人如何干净地解决状态之间的转换问题(一个状态应该如何使用其他状态的数据),等等。有没有人有使用C ++设计或编写实现的技巧,或者还有更好的代码示例?


根据meta中的讨论对标签进行了编辑:meta.gamedev.stackexchange.com/questions/103/…– lathomas64
2010年

Answers:


12

我根据Thor Alexander编辑的“大型多人游戏开发”中的一章编写了FSM。内部是一章,标题为“可信字符的并行状态机”。这是用python编写的,但是这些概念很容易转换为C ++。我强烈建议您检查一下,即使这是关于角色状态,而不是游戏状态。

我在这里创建的内容是:https : //github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager 在StateManager下查看实现细节,但是基本上您可以使用不同的“基本状态”采用。然后从那里有要转换为字符的特定状态,因此每个状态都是一个类。然后,您检查是否可以从一种状态转换为另一种状态,然后在“输入”时进行切换,还可以轻松地进行诸如进入状态后放入事件之类的操作。到目前为止,我发现这对游戏确实非常有效。

我所实现的是这本书所说的并行状态机,这是多个fsm共同工作的基本条件,在这种情况下,您可以转换为一种状态,从而阻塞所有其他状态(即:CreatureState_Dead)。我不会详细介绍,因为我认为这不会真正帮助您,但是如果您愿意,我可以详细说明。




8

通过示例对游戏AI进行编程(http://www.ai-junkie.com/books/toc_pgaibe.html)提供了一个非常简单的示例实现,并且仅处理基础知识。转换是通过单个方法调用来处理的(首先是Enter(),然后是Execute(),每个更新,转换时是Exit())>我不知道您还需要什么。我将实现更复杂的过渡,因为它们自己的状态仅设计为执行一次并按顺序移至下一个状态。

我会尝试一下,假设您正在使用AI的FSM,如果这样的话,我建议您看一下行为树。AIGameDev上有一些很棒的文章。


1
该示例也可以在他的网站上找到:ai-junkie.com/architecture/state_driven/tut_state1.html
Zolomon

5

如果C ++模板魔术和潜在的较长编译时间对您来说不是问题,并且您已经安装了Boost即可使用

Boost现在具有高效的功能(速度和大小元状态机库,其优点是可以让您与状态结构分开设置过渡表:您有一个表来描述何时从两栖状态过渡到其他状态。您只需阅读它即可了解状态机中正在发生的事情。

另一个优点是,即使在具有高性能软件的嵌入式软件中,也已经有多家企业对其进行了测试(有关详细信息,请参见增强邮件列表)。由于实现已经存在,因此如果您需要Just Works(tm)的通用状态机实现,则可能是一个不错的选择。

它还支持正交状态(并行状态)和其他有用的基于UML的功能。

它还提供了几种表示过渡表的方法,一种是实验性的,但在表达性方面很有趣(尽管受当前编译器性能的限制-太糟糕了!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.