zoukankan      html  css  js  c++  java
  • 状态机

    package framework.fsm{
        public class Fsm{
            
            protected var _curState:State;
            protected var _callbackChangeState:Function;
            /**
             * 状态机
             * @param    defaultState 默认状态
             * @param    callbackChangeState 改变状态回调函数 function(state:State):void;
             */
            public function Fsm(defaultState:State,callbackChangeState:Function){
                _callbackChangeState=callbackChangeState;
                changeState(defaultState);
            }
            
            public function changeState(state:State):void{
                if(_curState)_curState.dispose();
                _curState=state;
                _callbackChangeState(_curState);
            }
            
            public function update():void{
                _curState.execute();
            }
            
            public function dispose():void{
                _curState=null;
                _callbackChangeState=null;
            }
            
            public function get curState():State{return _curState;}
        };
    }
    package framework.fsm{
        public class State{
            public function execute():void{}
            public function dispose():void{}
        };
    }
    package app{
        import framework.fsm.Fsm;
        import framework.fsm.State;
        public class StatePlayerIdle extends State{
            
            private var _player:Player;
            public function StatePlayerIdle(player:Player){
                _player=player;
            }
            
            override public function execute():void{
                //这个状态切换到其他状态的条件
                if(_player.isDeath){
                    _player.fsm.changeState(new StatePlayerDeath(_player));
                }else if(_player.isInAir){
                    if(_player.vy<0){
                        _player.fsm.changeState(new StatePlayerJumpUp(_player));
                    }else{
                        _player.fsm.changeState(new StatePlayerJumpDown(_player));
                    }
                }else if(!_player.isInAir && _player.isPressLR){
                    _player.fsm.changeState(new StatePlayerWalk(_player));
                }
            }
            
            override public function dispose():void{
                _player=null;
            }
        };
    
    }
    private var _fsm:Fsm;
    _fsm=new Fsm(new StatePlayerIdle(this),changeStateHandler);
    
    private function changeStateHandler(state:State):void{
        if(state is PlayerStateIdle){
            //改变外观代码
        }
    }
    
    private function update():void{
        _fsm.update();
    }
  • 相关阅读:
    排球教练积分程序
    排球积分程序
    排球积分程序
    14周总结
    本周总结
    排球计分规则
    我与计算机
    排球计分程序
    《如何成为一个高手》观后感
    十八周总结
  • 原文地址:https://www.cnblogs.com/kingBook/p/5589925.html
Copyright © 2011-2022 走看看