QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1202|回复: 9

[讨论]关于多个状态机的配合

[复制链接]
发表于 2004-11-18 10:02:40 | 显示全部楼层 |阅读模式
我在设计游戏,游戏里的对象里有若干个状态机(是动态组合的,数量会变化),每个状态机有一个状态数据集,还有若干个行为集合,根据状态数据集里的状态数据来决定使用哪个行为集合来响应外界的刺激(也就是外界的函数调用)。但是一个对象会由多个状态集合来描述,比如一个人物被施加了魔法盾这个魔法,那么这个人物里就会有两个状态集合:一个用来描述人物的生命、法力等属性,一个用来描述“具有魔法盾”这个状态。这时外界对这个人物施加任何魔法都会减少效果,但是这得由第二个状态机来实现,但是人物本身无法理解“魔法盾”这个概念,在它被通知“被某某施加了某某魔法”时它并不知道需要让第二个状态机来应付这种外界刺激,但是这时显然需要让魔法盾所在的状态机来执行一些操作(减少魔法的效果),而且不仅仅需要魔法所在的状态机来响应这种外界刺激,由于魔法盾发挥作用后生命值等状态数据仍然会受到魔法的影响,所以这时还需要第一个状态机进行响应,而且必须要和魔法盾所在的状态机相互配合。
我所要解决的问题是:当使用多个状态机来描述一个对象时,应该采用怎样的一种机制来实现各个状态机之间的通讯和配合。附加条件:1.各个状态机之间可能根本不认识,因为可能有些是在程序写好后又从一些连接库里读取出的新的状态机;2.一个对象里会有若干个子对象,这些子对象也一样会由若干个状态机来描述,这些子对象、状态机之间同样可能互相不认识,对象是一个树状的结构。
另外,我准备把处理用户操作命令的模块也做成状态机,和其他状态机放在一起。
发表于 2004-11-18 15:05:17 | 显示全部楼层
我的建议,觉得好玩随便想的。

1。首先画状态机图,明确状态机的迁移。
2。使用链表,确定状态机间的优先级,优先级高的插入时插在比它低的前面。
3。确定互斥的状态机,即例如某个在的话,插入某个是禁止还是删除前者。
4。各个状态机抽象成接口
   一个处理事件的方法,返回需要传给下个状态机的事件。
   一个判断是否需要删除自身的方法。

当收到一个事件时,依次呼叫链表中的 状态机的处理方法,如果返回了一个事件,传给下个状态机,如果没有,返回。
每次呼叫上述方法时都要呼叫判断是否删除的方法,来决定是否删除那个状态机。
回复

使用道具 举报

 楼主| 发表于 2004-11-18 18:12:20 | 显示全部楼层
你的意思是不是:
把各状态机按照处理事件的顺序排列,然后顺序处理事件?
可是有几个问题:各个事件的处理顺序可能有所不同,对于以后新读入的状态机,根本就不知道它是干什么的,怎么知道该排在哪个位置?
回复

使用道具 举报

发表于 2004-11-18 20:10:22 | 显示全部楼层
[quote:70516e2137="sjinny"]你的意思是不是:
把各状态机按照处理事件的顺序排列,然后顺序处理事件?
可是有几个问题:各个事件的处理顺序可能有所不同,对于以后新读入的状态机,根本就不知道它是干什么的,怎么知道该排在哪个位置?[/quote]

我说的有顺序处理的意思,但每个状态机要决定是否根据传来的事件再作出一个事件传给下个状态机。

根本就不知道它是干什么的?
答: 所以要抽象成有共同的接口。
也不知道该排在什么位置?
质问:你不要告诉我说各种状态机间关系的基本原则都没有设计就开工,那,你只能等着出现万能编程语言的出现了。
回复

使用道具 举报

 楼主| 发表于 2004-11-18 22:20:16 | 显示全部楼层
[code:1]
也不知道该排在什么位置?
质问:你不要告诉我说各种状态机间关系的基本原则都没有设计就开工,那,你只能等着出现万能编程语言的出现了。
[/code:1]

可以设想一下,在一个游戏开发完成后,要增加一些新的魔法,这些魔法会使对象具有一些以前所没有的状态(即状态机),这些状态机是从动态连接库里读取出来的,你在一开始开发游戏时能知道以后会增加什么新的魔法吗?
回复

使用道具 举报

发表于 2004-11-18 23:15:00 | 显示全部楼层
增加什么魔法不知道,但增加的魔法必须受限于一个设计好的规则。否则只能改程序喽。

顺便提一句,我觉得这是写软件的常识阿。
回复

使用道具 举报

发表于 2004-11-18 23:20:02 | 显示全部楼层
给人物添加许多属性,所有状态机都围绕这些属性进行操作,有一个总得仲裁的,根据属性选则具体操作,而选则的方法可以是定植的规则,这样应该好点,胡乱说说
回复

使用道具 举报

 楼主| 发表于 2004-11-19 12:22:38 | 显示全部楼层
设计好的规则?你的意思是……用已有的元素组成新的魔法?但是那样灵活性就受到了限制了……

dxz, 我希望在程序写好后能够给对象添加新的属性(状态机的状态数据)……
回复

使用道具 举报

发表于 2004-11-19 20:11:47 | 显示全部楼层
但是好的程序都是有个最小的功能子集,然后用脚本来是实现扩展,要是全部做在程序里,估计会很复杂,效率也不会高,设计好的规则可以用脚本来实现,就如vim或emacs的脚本一样
回复

使用道具 举报

 楼主| 发表于 2004-11-19 23:14:15 | 显示全部楼层
我想使用动态连接库里的程序和使用脚本是没有本质区别的吧……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 01:40 , Processed in 0.048489 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表