AI好きな管理人が個人で勉強しているAIの技術を備忘録代わりとして色々と書いていくwikiです

実装してみよう その1の続き。
その1ではノードステータスと全てのノードが継承するBehaviorノードを作成した。
ここではBehaviorノードを派生させ、Conditionalノードを実装していく。

・Decoratorノード
Conditionalノードを実装する前にDecoratorノードクラスを作成する。
class Decorator : public Behavior
{
protected:
	Behavior* m_pChild;

public:
	/*! @brief コンストラクタ */
	Decorator(Behavior* child) :m_pChild(child){}
};
ただBehavior型の変数を1つ持つだけのクラス。
このクラスだけではビヘイビアノードの機能は使えないので派生させる。



・Conditionalノード
ConditionalはDecoratorを継承する。
#include <functional> // <<! ファイル上部に追加
class Conditional : public Decorator
{
public:
	/*! @brief コンストラクタ */
	Conditional(Behavior* child, std::function<bool(void)> func) : Decorator(child), m_Func(func){}

	/*! @brief 初期化処理 */
	void OnInitialize(Enemy* owner) override
	{
	}

	/*! @brief 更新処理 */
	Status Update(Enemy* owner) override
	{
		for (;;) {
			if (m_Func() == true) {
				m_pChild->Tick(owner);
				return m_pChild->GetStatus();
			} else {
				return BH_FAILURE;
			}
		}

		return BH_INVALID;
	}

protected:
	std::function<bool(void)> m_Func;
};
Conditionalクラスが変数としてもつ m_Func は条件式を格納するためのもので
コンストラクタでラムダ式を渡せばこの変数に式ごと格納される。
ラムダ式を渡すようにしたのはConditionalをどんな条件式でも正常に作動するようにするため。
ラムダ式を渡さない方法だと条件式ごとにクラスを書かなければならなくなる。
Updateメソッドではコンストラクタで渡された条件式を評価し true であれば子のノードを実行しfalse ならばFAILUREステータスを返す。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます