游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2169|回复: 3

游戏中的有限状态机实现

[复制链接]

18

主题

66

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2006-12-9 17:12:00 | 显示全部楼层 |阅读模式
根据这篇文章怎么我就写不出来,大家看看是怎么回事?
http://www.nightin.net/main.asp?page=_5&item=_001

template< class EntityType >

class State
{
public:
        virtual ~State() {}
        virtual void Enter( EntityType* ) = 0;
        virtual void Execute( EntityType* ) = 0;
        virtual void Exit( EntityType* ) = 0;
};       

template< class EntityType >

class StateMachine
{
private:       
        EntityType *m_pOwner;        // FSM的拥有者       
        State< EntityType > *m_pCurrentState;        // 目前所处的状态

public:
        // 更新函数
        void Update() const
        {
                if( m_pCurrentState )
                        m_pCurrentState->Execute( m_pOwner );
        }

        // 转换状态
        void ChangeState( State< EntityType > *pNewState )
        {
//                assert( pNewState && "[StateMachine::ChangeState]: pNewState == NULL" );
                // 调用上一个状态的结束函数
                if( m_pCurrentState != NULL )
                        m_pCurrentState->Exit( m_pOwner );
                m_pCurrentState = pNewState;
                // 调用新状态的进入函数
                m_pCurrentState->Enter( m_pOwner );
        }
        State< EntityType > * getstate(){
                return m_pCurrentState;
        }
};


class Peon
{
private:
        StateMachine&lteon> *m_pStateMachine;
public:
        void Update()
        {
                m_pStateMachine->Update();
        }
        void ChangeState( State<Peon> *pNewState )
                { m_pStateMachine->ChangeState( pNewState );}
        State<Peon>* GetLocation(){
                return m_pStateMachine->getstate();
        }
        void ChangeLocation(State<Peon>* s){m_pStateMachine->ChangeState(s);}

};

#define GoldMine EnterMineAndDigForGold::GetInstance()


// 进入金矿采矿
class EnterMineAndDigForGold : public State< Peon >
{
private:
        EnterMineAndDigForGold()        {}
public:
        // 使用Singleton设计模式
        static EnterMineAndDigForGold *GetInstance();

        // 进入状态时的动作
        virtual void Enter( Peon *pPeon );
        // 在次状态时的动作
        virtual void Execute( Peon *pPeon );
        // 离开状态时的动作
        virtual void Exit( Peon *pPeon );
};

void EnterMineAndDigForGold::Enter( Peon *pPeon )
{
        // 苦工同学钻入了地洞
        if( pPeon->GetLocation() != GoldMine )
                pPeon->ChangeLocation( GoldMine );
}

void EnterMineAndDigForGold::Execute( Peon *pPeon )
{
        // 苦工同学在努力的挖矿……
//        pPeon->AddToGoldCarried( 1 );

        // 终于他挖完了
//        if( pPeon->PocketFull() )
                // #define _BackToGreatHall BackToGreatHall::GetInstance()
//                pPeon->ChangeState( _BackToGreatHall );
}

void EnterMineAndDigForGold::Exit( Peon *pPeon )
{
}

// 一种实现 Singleton 的方式
EnterMineAndDigForGold *EnterMineAndDigForGold::GetInstance()
{
        static EnterMineAndDigForGold Instance;
        return &Instance;
}



void main()
{
Peon * p = new Peon;
p->Update();
}






/////其中的GoldMine指的是什么?是下面这样吗?
#define GoldMine EnterMineAndDigForGold::GetInstance()






7

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2006-12-10 22:12:00 | 显示全部楼层

Re:游戏中的有限状态机实现

enum location_type
{
  shack,
  goldmine,
  bank,
  saloon
};

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2006-12-11 11:46:00 | 显示全部楼层

Re:游戏中的有限状态机实现

void Update() const
{
if( m_pCurrentState )
m_pCurrentState->Execute( m_pOwner );
}

Execute()是非const函数, 这样编译会通过吗?

0

主题

17

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2007-3-11 22:56:00 | 显示全部楼层

Re:游戏中的有限状态机实现

有限状态机,在服务器开发中用的很多的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 16:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表