#include "RUBehaviacTreeManger.h" NS_RU_BEGIN static RUBehaviacTreeManger* _instance = nullptr; const static std::string RUBEHAVIACTREEMANGER_SCHEDULER_KEY = "RUBEHAVIACTREEMANGER_SCHEDULER_KEY"; RUBehaviacTreeManger* RUBehaviacTreeManger::getInstance() { if(_instance == nullptr) { _instance = new RUBehaviacTreeManger(); _instance->_startUpdate(); } return _instance; } void RUBehaviacTreeManger::destroyInstance() { if(_instance != nullptr) { Director::getInstance()->getScheduler()->unschedule(RUBEHAVIACTREEMANGER_SCHEDULER_KEY, _instance); delete _instance; } _instance = nullptr; } void RUBehaviacTreeManger::_startUpdate() { Director::getInstance()->getScheduler()->schedule(CC_CALLBACK_1(RUBehaviacTreeManger::_update, this), this, 0, false, RUBEHAVIACTREEMANGER_SCHEDULER_KEY); } void RUBehaviacTreeManger::_addBehaviacTree(RUBehaviacTree* tree) { _addBehaviorTrees.insert(tree); } void RUBehaviacTreeManger::_removeBehaviacTree(RUBehaviacTree* tree) { _removeBehaviorTrees.insert(tree); } void RUBehaviacTreeManger::_update(float dt) { _runningBehaviorTrees.insert(_addBehaviorTrees.begin(), _addBehaviorTrees.end()); _addBehaviorTrees.clear(); //遍历的过程中可能会addBehaviacTree或removeBehaviacTree for (auto iter = _runningBehaviorTrees.begin(); iter != _runningBehaviorTrees.end();iter++) { (*iter)->_update(); } for (const auto &elem : _removeBehaviorTrees) { _runningBehaviorTrees.erase(elem); } _removeBehaviorTrees.clear(); } NS_RU_END