[因为我不懂啊] (因为我不懂英语怎么说)
本文目录导航:
- [因为我不懂啊]-什么是状态机编程(设计模式)(3)
- [玩转UE4/UE5动画系统>设计篇>动画状态机设计模式] 之 洋葱模式(Onion Pattern)
- 动画状态机设计模式:洋葱模式简介
- JAVA+项目流程中状态多,如何设计便于维护?
[因为我不懂啊]-什么是状态机编程(设计模式)(3)
上一篇文章写完之后,我一直在想做一个游戏示例,想将之前学到的状态机模式运用在其中。
然而一直遇到各种奇怪的bug(之后写出来),所以一直没有完成这件事。
而且加之自己又犯懒了,所以我决定做一件更简单的事,以更容易接近的目标来引诱懒的不行的自己。
![[因为我不懂啊] (因为我不懂英语怎么说) [因为我不懂啊] (因为我不懂英语怎么说)](http://blog.seo.xz.cn/zb_users/upload/sanimg/b79ebefd819d10ba6665ab2f1c023661.png)
废话说完,来说正经事了。
前几天认真看了一篇 博客-游戏状态机(侵立删),觉得挺不错的,建议盆友们认真看一看。
读完博客之后,之前计划的示例貌似有了头绪,(废话型)总结出来,实现一个游戏状态机结构需要进行如下几步:
我要做一个简单的UI切换示例,所以简述需求就是: 打开程序进入主界面,主界面中点击开始游戏,进入游戏界面,游戏界面中点击结束游戏,进入结算界面,结算界面可以点击回到主界面,进入主界面,也可以点击重新开始游戏,再次进入游戏界面。
从需求描述来看,状态有三个:
事件有四个:
然后(装模作样的)画了一个状态转换表:
之前一篇文章中有提到过的,在Cocos2d-x游戏开发中,刚好使用Scene来作为控制器,由Scene来控制各层的出现和消失。
这里贴出Scene的源码(完整的源文件,包括了后续步骤才会出现的状态基类,以及派生的状态类):
上面可以看到,Scene中主要包含了:
包含了以上内容,本示例中的这个Scene就能起到控制器的作用了。
状态基类是很有必要的,为了达到各个同级状态都能通过同一个控制器来进行状态转换的目标,各个状态类进行切换时必须有一套统一的流程。 这里贴出本示例中状态基类的源码:
这个源文件中包含了:
所有的派生状态类都会 include 这个文件,实现虚基类 GameTwoState 中的方法,所以所有的状态类都有统一的切换流程:
而且在完成某个事件,需要进行状态转换时,可以通过发送自定义事件来完成消息的传递,自定义事件名放在这里也是为了方便起见。
这里直接贴出几个State的源码了,其中包含注释,废话就不重复再写了:
到这里,上面所提到的步骤全部进行完了。
这个UI切换的状态机示例也就完成了。
在中,直接进入Scene中:
进入主界面 :
此时的Log:
点击Start,进入游戏界面 :
此时的Log:
<Exit>->MainLayer <Enter>->GameLayer <Execute> ->GameLayer
点击Over,进入结算界面 :
此时的Log:
<Enter>->GameLayer <Execute> ->GameLayer [Event]->Game_Over <Exit>->GameLayer
<Enter>->ResultLayer <Execute> ->ResultLayer
点击Replay,重新进入游戏界面 : 此时的Log:
<Enter>->GameLayer <Execute> ->GameLayer [Event]->Game_Over <Exit>->GameLayer
<Enter>->ResultLayer <Execute> ->ResultLayer [Event]->Result_Replay <Exit>->ResultLayer
<Enter>->GameLayer <Execute> ->GameLayer
点击Over,再次进入结算界面,然后在结算界面点击Home,回到主界面 上面的两次操作完成后,Log如下:
<Enter>->GameLayer <Execute> ->GameLayer [Event]->Game_Over <Exit>->GameLayer
<Enter>->ResultLayer <Execute> ->ResultLayer [Event]->Result_Replay <Exit>->ResultLayer
<Enter>->GameLayer <Execute> ->GameLayer [Event]->Game_Over <Exit>->GameLayer
<Enter>->ResultLayer <Execute> ->ResultLayer [Event]->Result_Home <Exit>->ResultLayer
<Enter>->MainLayer <Execute> ->MainLayer
这里用FSM实现UI切换示例只是众多方法中的一种,暂时还没有去比较它们的优劣。(使用markdown编辑器的经验值+1)
可能性多种多样,如果有小伙伴比较过这些方法。
求留言告知,求分享经验。
[玩转UE4/UE5动画系统>设计篇>动画状态机设计模式] 之 洋葱模式(Onion Pattern)
本文档是《玩转UE4/UE5动画系统》系列教程的一部分,由作者老王在知乎和CSDN的专栏同步发布。
教程内容将通过开源项目形式存放在GitHub:玩转UE4(GitHub),所有资源和工程文件均可供免费查阅和下载。
动画状态机设计模式:洋葱模式简介
作为虚幻引擎动画系统学习实践的一部分,我分享了动画状态机设计模式中的洋葱模式概念。
虽然并非严格意义上的软件设计模式,但用于理解和组织复杂动画状态机逻辑,有助于降低复杂度并促进代码复用。
值得注意的是,目前虚幻引擎动画模块的特性限制了对其设计模式的总结,但随着引擎的发展,这个领域仍有待丰富和完善。
以advanced locomotion system v4中的八方位地面运动为例,我们首先实现基础状态机,包含八个方向的走/跑混合,命名为8-direction Movement : Base,并存储其姿态。
接着,创建细节状态机8-direction Movement : Gait Detail,添加步态细节,如Normal、Excited和Tired状态,每个状态内部包含基础状态机,并通过Gait标志位控制状态切换。
洋葱模式是动画状态机设计模式的一种尝试,虽然目前尚不完善,但它提供了一种组织和理解复杂动画逻辑的有效框架。
希望这个分享能启发大家在虚幻引擎的动画设计中找到适合自己的方法。
持续关注,期待虚幻引擎动画模块的进一步发展和动画设计模式的深化。
JAVA+项目流程中状态多,如何设计便于维护?
在Java项目流程中,状态多确实会增加项目的维护难度。为了便于维护,可以考虑以下设计方案:
综上所述,设计Java项目时需要考虑到状态多的情况,通过统一状态管理、使用状态机模式、使用设计模式、划分模块、统一命名规范等方案来处理多状态的问题,可以降低维护难度,提高代码质量。