评论

什么是状态机?如何在微信小游戏制作工具中实现状态机

一个游戏开发中很好用的工具。

嗨!大家好,我是小蚂蚁。

今天跟大家分享一个在游戏开发中非常有用的概念和工具——状态机。它都可以用于哪里呢?例如游戏中有一个敌人,他可以待机,追赶玩家,攻击玩家。这个敌人的一系列的行为就可以使用状态机来方便的组织和管理。

状态机的概念

这样讲还是很抽象,我们先来看一张图。

要理解状态机,首先我们需要理解什么是状态,状态是状态机中一个单元,如上图,敌人有三个状态,待机、追赶、攻击,每个状态都是一个独立的单元。状态有一个重要的特性(互斥性),即同一时间只有一个状态是有效的。敌人只能要么待机,要么追赶,要么攻击,不能在待机的同时还进行攻击,也不能在追赶的同时进行攻击(虽然边跑边打也是一种常见情况,此时要做的是增加一个追赶攻击的状态,而不能追赶和攻击两种状态同时有效)。

理解了状态之后,接下来我们再来看状态之间的切换。

独立的状态只有在连接起来,并且加上了切换条件,才能称作是一个状态机。状态之间是可以切换的,决定一个状态何时切换到另一个状态的是切换条件,只要满足了这个条件,就可以进行状态的切换。

我们来解读一下上面的简单的状态机,敌人一共有三个状态:待机、追赶、攻击。

待机和追赶两个状态是可以互相切换的,待机状态下,如果角色到达了追赶范围之内(满足切换条件),就切换为追赶状态,如果角色超出了追赶范围,就由追赶状态切换为待机状态。

追赶和攻击两个状态是可以互相切换的,追赶状态下,如果追上了角色,到达攻击范围内,就切换为攻击状态。攻击状态下,如果跑出了攻击范围,就切换为追赶状态,继续追赶。

最后,我们简单总结一下:状态机可以应用于游戏中包含多种状态的对象,方便的对其状态进行组织和管理。状态机包含三个部分:状态状态切换切换条件。其中状态具有互斥性,角色同一时间只能处于一个状态中;状态与状态之间通过切换进行连接,有些状态可以切换,有些状态不能切换;切换条件决定了一个状态是否能够切换到另一个状态。

状态机的实现

状态机是一个概念,具体的实现有很多不同的方式,例如在专业的游戏引擎中都会有自带的状态机功能的实现,表现形式和使用方法也都有一些差异性。不过只要你能够理解状态机,并能清晰的绘制出上面那样的状态机图片,就一定能很快的进行应用。

微信小游戏制作工具没有提供现成的状态机功能或组件,但是只要有了概念,以及清晰的需求,我们就可以利用现有的东西来做出一个状态机的功能。

接下来,我将在微信小游戏制作工具中实现一个敌人状态机的示例,就实现上方所举例的包含三个状态的敌人。

先准备几个素材。

如图,一个敌人,一个角色,一个控制角色的摇杆。角色和摇杆很简单,没有任何逻辑,他们的主要作用就是进行测试。

我们重点来看敌人,先为敌人创建一些变量。

当前状态: 用于记录当前敌人处理哪个状态,待机,追击,攻击三个不同的状态分别用 0,1,2 表示。

追击距离:用于设置敌人与角色距离多远后进行追击。

攻击距离:用于设置敌人与角色距离多远后就行攻击。

创建几个通知,直接从字面意思理解即可。

接下来,我们重点来看敌人的积木逻辑。

上面的这段就是敌人状态机的核心逻辑了,其实并不复杂,游戏启动后,状态机就开始工作了,在一个“重复执行”循环中不停的运行,根据敌人当前所处的状态,判断是否满足切换条件,满足的话,就切换到新的状态。

接着,再看“切换状态”通知的处理。

它其实就是一个中转站,根据敌人当前的状态,发送不同的处理通知。

最后,看一下不同状态下的处理逻辑。

这里每个状态下,我只做了简单的处理,其实每种状态都可以添加更多的逻辑处理,例如待机状态下,让敌人漫无目的的在一个范围内随机移动;追击状态下,敌人会因为体力不支而越跑越慢;攻击状态下,每攻击 5 次后,敌人会给与角色一次重击等等......

最后,结合着这张图,你可以再理解一下整个状态机的实现逻辑。状态机的核心是一个循环,在循环中根据不同的状态,判断不同的条件,满足条件后切换状态,并执行当前状态下的处理。

执行一下,看看不同状态切换的效果。

待机和追击的切换:

追击和攻击的切换:

今天的内容就到这里,希望它可以帮助你理解状态机的概念,并能在今后的游戏开发中,将这个强大的概念和工具应用到你的游戏里。

欢迎关注我的微信公众号【小蚂蚁教你做游戏】,学习更多游戏开发原创教程。

点赞 1
收藏
评论

1 个评论

登录 后发表内容