RUBehaviacTreeManger.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "RUBehaviacTreeManger.h"
  2. NS_RU_BEGIN
  3. static RUBehaviacTreeManger* _instance = nullptr;
  4. const static std::string RUBEHAVIACTREEMANGER_SCHEDULER_KEY = "RUBEHAVIACTREEMANGER_SCHEDULER_KEY";
  5. RUBehaviacTreeManger* RUBehaviacTreeManger::getInstance()
  6. {
  7. if(_instance == nullptr)
  8. {
  9. _instance = new RUBehaviacTreeManger();
  10. _instance->_startUpdate();
  11. }
  12. return _instance;
  13. }
  14. void RUBehaviacTreeManger::destroyInstance() {
  15. if(_instance != nullptr)
  16. {
  17. Director::getInstance()->getScheduler()->unschedule(RUBEHAVIACTREEMANGER_SCHEDULER_KEY, _instance);
  18. delete _instance;
  19. }
  20. _instance = nullptr;
  21. }
  22. void RUBehaviacTreeManger::_startUpdate() {
  23. Director::getInstance()->getScheduler()->schedule(CC_CALLBACK_1(RUBehaviacTreeManger::_update, this), this, 0, false, RUBEHAVIACTREEMANGER_SCHEDULER_KEY);
  24. }
  25. void RUBehaviacTreeManger::_addBehaviacTree(RUBehaviacTree* tree) {
  26. _addBehaviorTrees.insert(tree);
  27. }
  28. void RUBehaviacTreeManger::_removeBehaviacTree(RUBehaviacTree* tree) {
  29. _removeBehaviorTrees.insert(tree);
  30. }
  31. void RUBehaviacTreeManger::_update(float dt) {
  32. _runningBehaviorTrees.insert(_addBehaviorTrees.begin(), _addBehaviorTrees.end());
  33. _addBehaviorTrees.clear();
  34. //遍历的过程中可能会addBehaviacTree或removeBehaviacTree
  35. for (auto iter = _runningBehaviorTrees.begin(); iter != _runningBehaviorTrees.end();iter++) {
  36. (*iter)->_update();
  37. }
  38. for (const auto &elem : _removeBehaviorTrees) {
  39. _runningBehaviorTrees.erase(elem);
  40. }
  41. _removeBehaviorTrees.clear();
  42. }
  43. NS_RU_END