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

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

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


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


状态机的概念

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

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


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


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


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


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


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


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


状态机的实现

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


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


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


先准备几个素材。

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

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

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

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

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

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

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

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

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

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

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

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

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


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

待机和追击的切换:

追击和攻击的切换:

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

相关文章
|
1月前
|
Docker 容器
Star 1.8k! 推荐一款更优雅的微信文章订阅工具,让阅读更便捷!
Star 1.8k! 推荐一款更优雅的微信文章订阅工具,让阅读更便捷!
|
4月前
|
小程序 索引 容器
微信小游戏制作工具中的滚动列表插件如何使用?
微信小游戏制作工具中的滚动列表插件如何使用?
64 1
|
1月前
|
前端开发 开发者
【微信公众号对接】有关签名一直报错,提示invalid signature问题(我的签名和使用微信开发者工具验证返回的签名的是一致的)但还是报错!!!
【微信公众号对接】有关签名一直报错,提示invalid signature问题(我的签名和使用微信开发者工具验证返回的签名的是一致的)但还是报错!!!
23 0
|
4月前
|
小程序 开发者
关于UniApp启动到微信小程序工具提示找不到app.json
关于UniApp启动到微信小程序工具提示找不到app.json
100 0
|
1月前
|
小程序 开发工具 开发者
解决微信开发者工具不能使用云开发的资源
解决微信开发者工具不能使用云开发的资源
|
18天前
|
小程序 开发者
【微信小程序】微信开发者工具 app.json: [“subpackages“][0][“root“] 字段需为目录 已解决
【微信小程序】微信开发者工具 app.json: [“subpackages“][0][“root“] 字段需为目录 已解决
13 0
|
18天前
|
小程序 开发工具 开发者
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
22 1
|
18天前
|
小程序 开发者 Windows
【微信小程序】微信开发者工具 内容错误 pages/cart/cart.json: [“usingComonent“][“van-card“]: “@vant/weapp/card/indx“ 未找到
【微信小程序】微信开发者工具 内容错误 pages/cart/cart.json: [“usingComonent“][“van-card“]: “@vant/weapp/card/indx“ 未找到
16 0
|
2月前
|
开发者
微信开发者工具真机调试连接状态在正常和未连接之间反复横跳
微信开发者工具真机调试连接状态在正常和未连接之间反复横跳
30 1
|
4月前
|
前端开发 开发者
【微信公众号对接】有关签名一直报错,提示invalid signature问题(我的签名和使用微信开发者工具验证返回的签名的是一致的)但还是报错!!!
【微信公众号对接】有关签名一直报错,提示invalid signature问题(我的签名和使用微信开发者工具验证返回的签名的是一致的)但还是报错!!!
52 0

热门文章

最新文章