单状态机的实现

// 单状态状态机
public class SingleStateMachine
{
    // Prev值保存上次操作值
    // Curr值保存当前操作值
    // 单状态机,不是true,就是false
    private bool m_bPrev;
    public bool Prev { get { return m_bPrev; } }
    private bool m_bCurr;
    public bool Curr
    {
        get
        {
            return m_bCurr;
        }

        set
        {
            ChgState(value);
        }
    }

    private Action m_funcRunEnter = null;
    private Action<float> m_funcRunUpdate = null;
    private Action m_funcRunExit = null;

    public SingleStateMachine(Action funcEnter, Action<float> funcUpdate, Action funcExit)
    {
        m_bPrev = false;
        m_bCurr = false;

        m_funcRunEnter = funcEnter;
        m_funcRunUpdate = funcUpdate;
        m_funcRunExit = funcExit;
    }

    public void ChgState(bool bNext)
    {
        if (m_bCurr == bNext)
        {
            // 保存操作值
            m_bPrev = m_bCurr;
            m_bCurr = bNext;
        }
        else
        {
            m_bPrev = m_bCurr;
            m_bCurr = bNext;

            if (bNext)
            {
                this.Enter();
            }
            else
            {
                this.Exit();
            }
        }
    }

    private void Enter()
    {
        if (m_funcRunEnter != null)
        {
            m_funcRunEnter();
        }
    }

    public void Update(float delta)
    {
        if (Curr && m_funcRunUpdate != null)
        {
            m_funcRunUpdate(delta);
        }
    }

    private void Exit()
    {
        if (m_funcRunExit != null)
        {
            m_funcRunExit();
        }
    }
}

今天把手上的事做完后,看了下状态机的代码,因为以前只会用,没有看状态机具体怎么实现的,这次看了之后有了更深的理解。
单状态机:singlemachine
状态机定义:
    // 正在回城中状态
    public SingleStateMachine RetreatingState { get; private set; }
初始化状态机:
     RetreatingState = new SingleStateMachine(this.runRetreatingBegin, this.runRetreating, this.runRetreatingEnd);
在update中更新状态机:
    // 回城状态处理
    this.RetreatingState.Update(updateTime);//只有当前curr为true,才会执行this.runretreating
切换状态机:
      //切换状态机
        public void TroopRetreating(bool bRetreat = true)
    {
        RetreatingState.Curr = bRetreat;
    }

游戏中回城部分用到了,只有没回城 已回城这种态,可以用bool 值表示为true false
回城单状态机初始化完成后,一旦改变curr变量的值,就会chgState:状态变化如下:
当前(curr)->下一个(next)
true->false
true->true
false->true
false->false
显然如果先后状态不一致,并且下一个状态是true,那么enter;先后状态不一致,下一个状态false,那么exit。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值