BehaviorTree.cc 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <boost/format.hpp>
  2. #include <glog/logging.h>
  3. #include "Base/Typedef.h"
  4. #include "BehaviorTree/BehaviorTree.h"
  5. #include "BehaviorTree/NodeFactories.h"
  6. #include "BehaviorTree/BehaviorTreeConf.pb.h"
  7. namespace Egametang {
  8. BehaviorTree::BehaviorTree(NodeFactories& factories, const BehaviorTreeConf& tree_conf):
  9. node(NULL)
  10. {
  11. type = tree_conf.type();
  12. const BehaviorNodeConf& node_conf = tree_conf.node();
  13. if (tree_conf.has_node())
  14. {
  15. const BehaviorNodeConf& node_conf = tree_conf.node();
  16. BuildTree(factories, node_conf, node);
  17. }
  18. }
  19. void BehaviorTree::BuildTree(
  20. NodeFactories& factories, const BehaviorNodeConf& node_conf,
  21. BehaviorNode*& node)
  22. {
  23. int32 type = node_conf.type();
  24. node = factories.GetInstance(node_conf);
  25. for (int i = 0; i < node_conf.node_size(); ++i)
  26. {
  27. const BehaviorNodeConf& logic_node_conf = node_conf.node(i);
  28. BehaviorNode* logic_node = NULL;
  29. BuildTree(factories, logic_node_conf, logic_node);
  30. node->AddChildNode(logic_node);
  31. }
  32. }
  33. BehaviorTree::~BehaviorTree()
  34. {
  35. delete node;
  36. }
  37. void BehaviorTree::Run(ContexIf* contex)
  38. {
  39. node->Run(contex);
  40. }
  41. std::string BehaviorTree::ToString()
  42. {
  43. boost::format format("type: %1%\node: %2%");
  44. format % type % node->ToString();
  45. return format.str();
  46. }
  47. } // namespace Egametang