状态机中使用事件优先级的探讨

发件人: Chen Chao
发送时间: 2010年3月11 16:37
收件人: Shen Yetao; zhang jin; Chen Hai; Zeng fanjian; Lu Yuan
抄送: Ding ling
主题: 答复: 关于状态机中的优先级问题

 

分析这个问题要从两个层面来看

一、策划提供的优先级参考,可不可以作为状态机设计的依据

根据ProjectX_战斗系统 8.2 节描述,有表如下:

优先级

行为

0

与世界内物品发生互动,比如开门,开锁

1

NPC谈话

2

调息

2

咏唱

3

普通移动

3

跳跃

3

普通攻击

此表是作为行为之间的打断关系的参考,并不能完全的体现其中的逻辑。

 

这里的“调息”既可以解释为一个动作,也可以解释为一个状态,我点击调息技能,首先是发出“开始调息”这个事件,然后就进入“调息”这个状态,对于事件来说,事件互相之间是没有打断概念的,对于状态来说,也没有A状态打断B状态这一说,因为状态不是动作。此表的意图是表明,1、调息这个动作可打断开门这个状态,2、而跳跃这个动作,又可打断调息这个状态(其实此处不能说是打断,而是迁移到跳跃状态)。此表隐藏未表达的情况是,站在箱子旁边咏唱到一半点箱子,此时开锁优先级应比咏唱高。

因此,在此表中状态和动作是混排的,不可作为状态机设计的完全依据。

 

[Shen Yetao] 这个我同意你的分析,的确不能作为你们设计的思路依据。只能如上次会议所说的,只是提供你们作为设计时的参考。供你们理解策划想达到的效果

对于那份表格,表述的意思是: ‘角色’在做某件事情的时候,他可以收到来自其它突发的‘情况’(被动)或者‘指令(来自玩家、主动)的指令,可以中止或者被限制不允许中止当前所做的事情

策划以后也会在描述时,将‘指令’、‘情况’进行说明,即对如何做某件事情也进行介绍

 

我这里列出这个表,主要的目的是说明,策划提出的优先级,并不是我们状态机里的优先级,不能生搬硬套。策划文档的主要功能是表明设计意图。

 

 

二、到底事件之间可否有优先级?能不能只通过修改事件的优先级,来达到控制状态间迁移的目的?

 

假设有 “事件1”,“事件2”,“事件3”分别对应优先级123,在状态A下,优先级>2,则可迁移到状态B,在状态B 下,优先级<2,则可迁移到状态A,看起来很合理对吗。但此时,我们变更需求,要求“事件1”也可以使状态A迁移到状态B,问题就出现了,有两种方法,第一种我们修改“事件1”的优先级为3,结果是B状态下判断“事件1”的优先级大于2,不能正确返回状态A,此方法不对!第二种是变更状态A的迁移条件为:优先级=1 or 优先级>2,这就回到了修改判断条件的老路上,对于这种情况,其效果等同于:如果是 事件1或事件3,就迁移。

 

[Shen Yetao] 这里我觉得你的逻辑有问题,如果在状态A下,优先级>2,则可迁移到状态B,在状态B 下,优先级<2,则可迁移到状态A这里你已经破坏了 ‘高优先级的事件才可以使状态迁移’ 这样一个基本的规则,这和设置优先级的初衷有所背离

 

我解释一下,我原本没有从你说的这个角度考虑,可能是我没完全理解。你说“高优先级的事件才可以使状态迁移”具体怎么解释?我的理解是,不管优先级高低,事件都可以使状态迁移,否则这个事件就没有存在的意义了。我假设的状态A下,优先级>2,则可迁移到状态B,这一条是假设“高优先级才迁移”这种情况,后面在状态B下,优先级<2,则可迁移到状态A,是说明,低优先级状态也可作为迁移条件,如果这里改成,在状态B 下,优先级>0,则可迁移到状态A,那么“事件1”“事件2”“事件3”都满足条件,但这可能不是我想要的设计。

 

从以上分析可以看出,“事件1”“事件3”作为两个不同的事件,不能通过设置相同的优先级这种方法,来达到控制状态间迁移的目的。如果非要设置“事件1”和“事件3”优先级相同,我们要做的是将两个事件合二为一,比如,将开门,开锁归纳为“事件打开”。

 

深究此问题的本质,事件是驱动状态迁移的唯一条件,对于同类型事件,我们可以归纳为一种事件。10种优先级,其实就是10个事件。

 

[Lu Yuan] 关于第二个,我觉得优先级设定有个最基本的原则就是不能循环。另外我觉得优先级存在的意义在于,程序方面减少代码的更改,把更多的逻辑交给策划来整理。

 

你说的不能循环,是指状态A,状态B之间不能来回切换吗?这可不对。第二个,你还在说优先级存在的意义,我的意思就是说,优先级会导致逻辑错误,就不存在减少代码更改的可能了。

 

[Lu Yuan] 我的意思是,如果策划设计中存在你说的那种情况,优先级的概念确实就不适用了,因为那相当于在某一优先级的很多事件中,既有事件能使A跳到B也有事件能使B跳到A

比如说你举的例子,那个里面变成了这样一种情况:在不考虑所谓优先级的情况下,状态A响应事件1会跳到B,然后状态B又会响应同样一个事件跳回到A,如果设计上存在着这样的情况,那优先级自然是不能用了。

如果策划方面想用优先级解决这种情况,必须把状态A响应的事件1和状态B响应的事件1分解成两个不同的事件,如果他们这样分出来了,优先级仍然是可以用的

 

请看下图:

 

“上马”这个事件,可以让状态来回切换,你不要说,策划会把“上马”“下马”两个按钮,这样就很傻了。你也不要说,策划需求里暂时没有上马这个需求,那我要说的就是,那是不是说我们以后就失去了设计上马功能的权利。

 

[Lu Yuan] 另外,一个状态并不是对所有级别的所有事件都响应,优先级不是事件的分类标准,只是里面的一个属性,状态是否进行跳转,首先取决于是否响应事件,然后才是加入优先级的概念来判断满不满足跳转条件。

 

你这句话里混杂了很多概念,我一一回答,

一个状态并不是对所有级别的所有事件都响应”,我的理解是,凡是进入这个状态的事件,都已经被当前状态接收到(可理解为处理过,查看过),要么,就是这事件没进来,所以,一个状态是处理了所有它自己接收到的事件,只是并不是所有事件都触发迁移。

 

优先级不是事件的分类标准,只是里面的一个属性”,既然你给 事件都加上了一个属性,并且这个属性有值,那我可不可以将同一个值的事件都看作一种类型?不要说不可以哟,具有同一特征的个体,可以划分为同一类型。

 

后面的一部分讨论逻辑不清,省略之

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值