BehaviorTree.cc 1.1 KB

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