ステートマシンでのゲーム開発の説明

なぜ我々は、ステートマシンが必要なのか

国家の役割は、高いメンテナンスコストにつながると低展開することができ、すべてが一つの部分に書かれた行動の多くを実装するために
避けるために、歩行、ジャンプ、撮影、変換、およびいくつかは、いくつかの複雑なロジックを達成することはできません、変換することができます:ようなを
(フルスクリーンすべての場合-他)

達成するための国家モードスイッチ

//包含着所有的状态
enum class State{StateA, StateB, StateC, ...} activeState;
...
//通过switch语句切换状态,根据具体情况实现细节
switch (activeState)
{
    case State.StateA:
        ...
        break;
    case State.StateB:
        ...
        break;
    .......
}
...

列挙とプロトタイプステートマシンは、状態間で切り替えるように音を充填することにより、switch文の現在の状態を表すが、( - 他のヒープ良いことがあればよりも確かですが)まだ低いの欠点を拡大するために、高いメンテナンスコストを持っています

有限ステートマシン(FSN)有限状態マシン

一般に、基本的な状態マシン、状態マシン、このような状態機械の他の変異体である
状態マシンの理解のために、好ましくは、マップ(図構造、ブロックステータス、矢印の状態間のリンクを描画しています)

有限ステートマシンは状態と異なる状態のカプセル化の間の切り替えは、一般的なニーズに応じて達成される方法を調整することが強調される
の「人工知能ゲーム」の実現を参照する
最初の基底クラスを基本クラスの状態の翻訳を必要とします

//状态基类,所有状态都继承这个类
class State
{
public:
    virtual ~State(){}
    virtual OnStateEnter(){}    //进入此状态执行一次
    virtual OnUpdate(){}        //每一帧执行一次
    virtual OnStateExit(){}     //跳出状态时调用一次
    list<Translation> translations; //状态迁移列表
};

//状态迁移
class Translation
{
public:
    virtual ~Translation(){}
    virtual bool isValid() = 0;         //用于判定迁移,可切换返回true
    virtual State* getNextState() = 0;  //进入下一个状态
    virtual void onTransition(){}       //迁移时调用
};

状態はOnStateExit自体が実行されたジャンプすることができた場合(ジャンプか否かを判断する基底クラスは翻訳)は各フレームのisValid(全翻訳を介して、翻訳が向け他の状態で彼を保つため、各状態を継承しています状態)、および現在の状態セットgetNextState()で得られました

そして、すべての状態を管理するために使用されるステートマシンクラスが、あります:

//状态机类
class FiniteStateMachine
{
public:
    void Update();          //每一帧运行一次
    State* initialState;    //初始状态
    State* activeState;     //正在运行的状态
    
protected:
    list<State> states;     //所有状态的实例
};

void FiniteStateMachine::Update()
{
    //遍历活动状态的所有迁移,若有可用的,则切换状态
    list<Translation>::iterator itr = activeState->translations.begin();
    for (int i = 0; i < activeState->translations.size(); ++i, ++itr)
    {
        if (itr->isValid())
        {
            activeState->OnStateExit();     //退出调用
            activeState = itr->getNextState();  //切换活动状态
            itr->onTransition();                //切换调用
            activeState->OnStateEnter();    //进入调用
            return;                 //直接返回
        }
    }
    //如果没有状态切换,运行一次update
    activeState->OnUpdate();
}

次の状態の具体的な詳細は、特定の、具体的な実現を継承します

階層的有限状態機械(HFSM)階層的なステート・マシン

さらにカプセル化された階層的な状態マシンは、有限状態機械に対応し、大状態に複数のパッケージ、及び運転「状態の履歴」の状態を記録するサブ状態が、この状態から切り出し、状態が大との間で切り替えることができます(構造を示します)

図StateAとStateBは、状態のより高いレベルに述べ添加単に再利用状態C(AC、BC間のリンクを省略)増加、状態から出るときは、CDの状態を切り替えることができる記録する
メジャーまず、高いパッケージングのアイデアのレベル、そして第二に、再利用の向上のために考えることをより高いレベルの幹部に切り替えるには
主に二つの方法で階層的なステートマシンを実装する:
まず、親状態は、ステートマシンで、状態を入力することができるが、追加
2を親子状態スタック記憶状態を追加状態にスタック、スタックの端の状態とは、メッセージを送信するときに、各状態のサブ状態がスタックの状態であり、状態まで再びスタックにスタックの新しいトップを処理できませんメッセージを処理するために、スタックの最上部までの状態。

同時ステートマシン

オブジェクトは、同時に動作する2台のステートマシンを有する二つの独立したステートマシン(ただし、オブジェクトの状態を変更することによって通信してもよい)、例えば、我々は足の動き(実行、しゃがみ、立っている)ことができるように並行状態機械を理解することができます(空打ちガン、標的)を単離及び手の動きを。

プッシュダウンステートマシン

(親の状態を記録することですが、階層的なステート・マシンの実装とスタックは完全に異なっている、階層的なステート・マシン・スタック、スタック状態に記録することである)、彼は状態のスタックを持っていることであるコア・ステート・マシンを押し下げます。
主なソリューションは、状態の実行に乗ることができない状態のステートマシンを積み重ねることです。
実装に加え、ステートマシンでスタックすると、スタックを終了するときの状態は、状態の状態を状態をプッシュします入ると、スタックは、国営操作です。
私は宿題空腹をしていたとき、たとえば、私が何かを食べたいです。空腹は、ほとんどの州は、状態に入ることができる何かを食べて、状態を「食べる」の終了後に、私は元の状態を復元したいです。

実行時には、ステートマシンはスタック上に「宿題」を持っている
とし、「私はおなかすいた」スタック「食べる」します
最後の「食べる」、スタックを「食べる」になる
「宿題」のスタックを実行し続けます(事実上不可能)

間違った場合は、指摘してください

おすすめ

転載: www.cnblogs.com/yasoudream/p/11802866.html