Cocos2d-xゲーム開発用の有限状態マシン(FSM)

まず、基本的にすべてのソフトウェアは有限状態マシン(FSM)です。これは、ノードのセットと対応する伝達関数のセットで構成される有向グラフです。簡単に言えば、これはイベント駆動型システムのモデルであり、このモデルは、限られた数の状態、いくつかの入力、および状態間の遷移の規則で構成されています。特定の瞬間に、1つまたはグループの状態がFSMの現在の状態になります。FSMは入力イベントを受け取り、変換ルールに従って現在の状態を新しい状態に変換します。FSMが独自の動作特性を持っているのは、これら3つの要素の組み合わせのためです。ゲーム開発では、人工知能の意思決定プロセスを実装し、ゲームオブジェクトの動作を制御するためにFSMが使用されます。

1.最も単純な状態機械

おそらく、上記の説明はまだいくらか抽象的なものです。ほとんどの記事では、「ドア」または「ロック」の例を使用して、ステートマシンとは何かを説明します。新しい例を挙げたいと思います。「サル」というNPCがあります。 、それは指定された領域を歩く、ときどきとどまる、それがその領域の境界に向かって歩くとき、それはそれ自体を回す(図1)。ステートマシンの変換ルール関数を表(図2)にリストし、リストされたルールに従って、この単純なステートマシンのC ++実装を記述します。

#ifndef MONKEY_H_
#define MONKEY_H_

#include

#include“ cocos2d.h”

USING_NS_CC;

#define MAX_STOP_TIME 10
#define MAX_WALK_TIME 20

#define MAX_WALK_DIST 100

列挙型MonkeyState
{ stSTOP、stWALK、stTURN };



クラスMonkey
:public Node
{ public:Monkey(){ log(“ Monkey()”); }




CREATE_FUNC(モンキー);

仮想ブールinit()
{ _curPos = 0; _step = 1;

changeState(stSTOP);

this-> scheduleUpdate();

trueを返します。
}

void changeState(MonkeyState newState)
{ _curState = newState; _curTime = time(0); }


void stop()
{ cocos2d :: log(“ stop()”); }

void walk()
{ _curPos + = _step; cocos2d :: log(“ walk():pos =%d”、_curPos); }


void turn()
{ _step * = -1; cocos2d :: log(“ turn():step =%d”、_step); }


void update(float dt)
{ switch(_curState){ case stSTOP:if(isStopTimeout()){ changeState(stWALK); 歩く(); } 休憩;






ケースstWALK:
walk();

if(isWalkOutBorder()){ changeState(stTURN); 順番(); } else if(isWalkTimeout()){ changeState(stSTOP); やめる(); } 休憩;






ケースstTURN:
changeState(stWALK);
歩く();
ブレーク;
}
}

プライベート:
MonkeyState _curState;

time_t _curTime;

int _curPos;
int _step;

public:
bool isStopTimeout()
{ return(time(0)– _curTime> MAX_STOP_TIME); }

bool isWalkTimeout()
{ return(time(0)– _curTime> MAX_WALK_TIME); }

bool isWalkOutBorder()
{ return(_curPos> MAX_WALK_DIST || _curPos <-MAX_WALK_DIST); } };


#endif // MONKEY_H_

 

2.悪いコードの匂い

明らかに、上記のコードを完全に書き続ければ、間違いなくうまく機能します。しかし、伝説の「悪いコード」の匂いがしたようですが、上記の長い条件付き判断ステートメントは、州が増えるにつれて長くなります。状態が追加されるたびに、長い条件付き判断ステートメントで慎重に検索および変更する必要があります。このような条件付きステートメントが成長して複数の人が協力して完了する必要がある場合、深刻なメンテナンスとデバッグの問題が発生します。さらに、コンパイルされた言語の場合、N状態のFSMは、正しい状態を見つけるために平均でN / 2の判断を行う必要があります。

上記のステートマシンでは、このオブジェクトは実際にはさまざまな状態でさまざまな動作特性を示します。基本的に、同様の正式なインターフェースを除いて、さまざまな動作特性の間には関係がありません。そして自然に状態モードを考え、状態モードを使って状態を維持し、オブジェクトの分離と維持状態を実現します。

おすすめ

転載: blog.csdn.net/qq_21743659/article/details/108637535