最終更新:
sudoubenpi 2014年09月09日(火) 01:39:18履歴
実装してみよう その1の続き。
その1ではノードステータスと全てのノードが継承するBehaviorノードを作成した。
ここではBehaviorノードを派生させ、Conditionalノードを実装していく。
・Decoratorノード
Conditionalノードを実装する前にDecoratorノードクラスを作成する。
このクラスだけではビヘイビアノードの機能は使えないので派生させる。
・Conditionalノード
ConditionalはDecoratorを継承する。
コンストラクタでラムダ式を渡せばこの変数に式ごと格納される。
ラムダ式を渡すようにしたのはConditionalをどんな条件式でも正常に作動するようにするため。
ラムダ式を渡さない方法だと条件式ごとにクラスを書かなければならなくなる。
Updateメソッドではコンストラクタで渡された条件式を評価し true であれば子のノードを実行しfalse ならばFAILUREステータスを返す。
その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ステータスを返す。
コメントをかく