一个简单确有用的有限状态机(FSM) in c++

原文:http://www.frozax.com/blog/2012/10/simple-useful-finite-state-machine-fsm-c/

我写了一个有限状态机的模板,因为我要写不同的FSM

1.状态用枚举来代替(便于调试)

2.要运行FSM,只需要setState和updateState(float delta_time)即可

3.用GetState来获取当前状态

4.许多转换都基于定时,因此我实现了方法GetTimeInCurState()

5.执行具体的action在这些方法内BeginState EndState UpdateState

// (c) Francois Guibert, www.frozax.com (@Frozax)
#pragma once

template<typename T>
class fgFSM
{
public:
  fgFSM() : _time_in_cur_state(0.0f), _cur_state(-1)
  {
  }

  virtual void BeginState( T state ) {}
  virtual void UpdateState( T state ) {}
  virtual void EndState( T state ) {}

  void SetState( T state )
  {
    EndState( (T)_cur_state );
    _cur_state = state;
    _time_in_cur_state = 0.0f;
    BeginState( (T)_cur_state );
  }

  void UpdateFSM( float delta_time )
  {
    if( _cur_state != -1 )
    {
      _time_in_cur_state+=delta_time;
      UpdateState( (T)_cur_state );
    }
  }

  float GetTimeInCurState() { return _time_in_cur_state; }
  T GetState() { return (T)_cur_state; }

private:
  float _time_in_cur_state;
  int _cur_state;
};

用法:

先建立需要应用到的状态枚举,比如

enum EState
{
  STT_OFF = -1, // optional, -1 is the initial state of the fsm
  STT_WALK,
  STT_RUN,
  STT_STOP,
  STT_EAT
};

然后继承class fgFSM

class ObjectUsingFSM: public fgFSM<EState>
{
public:
  // ...
  void UpdateState( EState t );
  void BeginState( EState t );
  void EndState( EState t );
  // ...
};

该机,结束语:

你可以在你的项目当中免费使用这些代码,这是非常简单又常用的,另外你可以在以后根据需要在在EndState()里面加入GetPrviousState()

GetNextState()等等。。。

转载于:https://www.cnblogs.com/tqj-zyy/archive/2013/03/03/4559821.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值