状态机解决复杂逻辑及使用 (2)

又加一个动画时机,写代码没底,做不下去了感觉,囧

1 鼠标 切换背景成程序A的视图/程序B的视图 IsBackgroundA 用于表示当前背景的变量
    切换程序AB激活状态   IsAppAActive 用于表示当前激活程序的变量  
2   快捷键   切换背景成程序A的视图/程序B的视图    
    切换程序AB激活状态    
3   程序A激活状态下   鼠标滑过X区域时,激活B   IsAppAActive =true&&CurrentActiveState 用于记录鼠标滑进X区域前的状态,方便滑出后赋值原始状态  
    鼠标滑出X区域时,恢复原始激活状态    
    执行程序B命令时,激活程序B    
4   激活程序时添加动画     IsRightAnimation 来选择动画展示效果 , IsBackgroundA&&IsAppAActive==》来选择动画展示时机  
5   不同设备间同步,添加发送命令和接受命令   需要多台设备同时开启程序进行同步   IsMaster 是否具有控制权  
6   切换背景时添加动画   切换程序A动画    
    切换程序B动画    
通过状态机整理逻辑: 定义的状态与触发事件 public enum ModelState { MainBackground, U3DBackground, U3DActive, U3DNotActive, TaskBarNormal } public enum ModelEvent { SetMainBackground, SetU3DBackground, SetU3DActive, SetU3DNotActive, IncCavansFunction, MouseEnterTaskbar, MouseLeaveTaskbar } 定义状态机事件 ... builder.In(ModelState.MainBackground) .On(ModelEvent.SetMainBackground) .On(ModelEvent.SetU3DBackground).Goto(ModelState.U3DActive); builder.In(ModelState.U3DBackground) .On(ModelEvent.SetMainBackground).Goto(ModelState.MainBackground); ... 为了统一操作流程,我将所有方法定义在状态进入时触发 ... builder.In(ModelState.MainBackground) .ExecuteOnEntry( () => { SetTaskbar(false, true); SetBackground(false); SetU3DActive(false); }); builder.In(ModelState.U3DActive) .ExecuteOnEntry( () => { StateMachineMsg += $"------------------------" + Environment.NewLine; StateMachineMsg += $"ModelState.U3DActive" + Environment.NewLine; SetTaskbar(true); SetU3DActive(true); SetBackground(true); }); ...

之后如果再有什么调整只需要给状态机增加状态和事件,或者调整状态就可以了。

状态及简单使用: 安装:

状态机解决复杂逻辑及使用

我觉得主要难点是定义状态和事件,最开始用的时候状态和事件会分不开。

我们拿上下电梯举例:

1.0版本:

电梯四个状态,开门,关门,上一层和下一层

状态机解决复杂逻辑及使用

代码描述:

builder.In(States.OnFloor) .On(Events.GoUp).Goto(States.MovingUp) .On(Events.GoDown).Goto(States.MovingDown) builder.In(States.MovingUp) .On(Events.Stop).Goto(States.OnFloor); builder.In(States.MovingDown) .On(Events.Stop).Goto(States.OnFloor); 2.0版本

在楼层时,我们增加开门关门的语音提示,我们增加一个关门/开门状态,在进入状态时播放提示

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydwjs.html