Magic_Game/core/Manager/ActionManager.cpp

258 lines
4.6 KiB
C++
Raw Normal View History

2018-04-21 21:24:46 +08:00
#include "..\e2dmanager.h"
#include "..\e2daction.h"
2018-05-24 00:58:16 +08:00
#include "..\e2dnode.h"
2017-10-19 00:50:04 +08:00
2018-07-05 01:09:54 +08:00
e2d::ActionManager * e2d::ActionManager::_instance = nullptr;
e2d::ActionManager * e2d::ActionManager::getInstance()
{
if (!_instance)
_instance = new (std::nothrow) ActionManager;
return _instance;
}
void e2d::ActionManager::destroyInstance()
{
if (_instance)
{
delete _instance;
_instance = nullptr;
}
}
e2d::ActionManager::ActionManager()
: _actions()
, _runningActions()
{
}
e2d::ActionManager::~ActionManager()
{
}
void e2d::ActionManager::update()
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || Game::getInstance()->isPaused())
2018-03-06 09:56:17 +08:00
return;
2018-08-12 15:38:02 +08:00
std::vector<Action*> currActions;
2018-08-12 20:19:47 +08:00
currActions.reserve(_runningActions.size());
2018-08-12 15:38:02 +08:00
std::copy_if(
_runningActions.begin(),
_runningActions.end(),
std::back_inserter(currActions),
[](Action* action) { return action->isRunning() && !action->_isDone(); }
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5><C4B6><EFBFBD>
for (const auto& action : currActions)
action->_update();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĶ<C9B5><C4B6><EFBFBD>
for (auto iter = _runningActions.begin(); iter != _runningActions.end();)
2018-03-06 09:56:17 +08:00
{
2018-08-12 15:38:02 +08:00
if ((*iter)->_isDone())
2018-03-06 09:56:17 +08:00
{
2018-08-12 15:38:02 +08:00
(*iter)->release();
(*iter)->_target = nullptr;
iter = _runningActions.erase(iter);
}
else
{
2018-08-12 15:38:02 +08:00
++iter;
2018-03-06 09:56:17 +08:00
}
}
}
void e2d::ActionManager::__add(Action * action)
2018-03-06 09:56:17 +08:00
{
2018-05-08 17:40:36 +08:00
if (action)
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
auto iter = std::find(_actions.begin(), _actions.end(), action);
if (iter == _actions.end())
{
_actions.push_back(action);
}
2018-03-06 09:56:17 +08:00
}
}
void e2d::ActionManager::__remove(Action * action)
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
if (_actions.empty() || action == nullptr)
return;
2018-07-05 01:09:54 +08:00
auto iter = std::find(_actions.begin(), _actions.end(), action);
if (iter != _actions.end())
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
_actions.erase(iter);
2018-03-06 09:56:17 +08:00
}
}
2018-07-05 01:09:54 +08:00
void e2d::ActionManager::resumeAllBindedWith(Node * target)
2017-10-19 00:50:04 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || target == nullptr)
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
{
if (action->getTarget() == target)
{
action->resume();
}
}
2017-10-19 00:50:04 +08:00
}
2018-07-05 01:09:54 +08:00
void e2d::ActionManager::pauseAllBindedWith(Node * target)
2017-10-19 00:50:04 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || target == nullptr)
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
{
if (action->getTarget() == target)
{
action->pause();
}
}
2017-10-19 00:50:04 +08:00
}
2018-07-05 01:09:54 +08:00
void e2d::ActionManager::stopAllBindedWith(Node * target)
2017-10-19 00:50:04 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || target == nullptr)
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
{
if (action->getTarget() == target)
{
action->stop();
}
2018-03-06 09:56:17 +08:00
}
}
void e2d::ActionManager::start(Action * action, Node * target, bool paused)
2018-05-08 17:40:36 +08:00
{
WARN_IF(action == nullptr, "Action NULL pointer exception!");
2018-05-08 17:40:36 +08:00
WARN_IF(target == nullptr, "Target node NULL pointer exception!");
if (action && target)
{
2018-05-24 12:24:39 +08:00
if (action->_target == nullptr)
{
2018-07-05 01:09:54 +08:00
auto iter = std::find(_runningActions.begin(), _runningActions.end(), action);
if (iter == _runningActions.end())
2018-05-24 12:24:39 +08:00
{
2018-07-22 21:22:27 +08:00
action->retain();
2018-05-24 12:24:39 +08:00
action->_startWithTarget(target);
action->_running = !paused;
2018-07-05 01:09:54 +08:00
_runningActions.push_back(action);
2018-05-24 12:24:39 +08:00
}
}
else
{
2018-08-15 00:06:03 +08:00
throw Exception("<EFBFBD><EFBFBD> Action <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>Ŀ<EFBFBD><C4BF>");
2018-05-24 12:24:39 +08:00
}
2018-05-08 17:40:36 +08:00
}
}
void e2d::ActionManager::resume(const String& name)
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || name.isEmpty())
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
2018-03-06 09:56:17 +08:00
{
if (action->getName() == name)
2018-03-06 09:56:17 +08:00
{
action->resume();
}
}
}
void e2d::ActionManager::pause(const String& name)
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || name.isEmpty())
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
2018-03-06 09:56:17 +08:00
{
if (action->getName() == name)
{
2018-03-06 09:56:17 +08:00
action->pause();
}
}
}
void e2d::ActionManager::stop(const String& name)
2018-03-06 09:56:17 +08:00
{
2018-07-05 01:09:54 +08:00
if (_runningActions.empty() || name.isEmpty())
return;
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
2018-03-06 09:56:17 +08:00
{
if (action->getName() == name)
2018-03-06 09:56:17 +08:00
{
action->stop();
}
}
2017-10-19 00:50:04 +08:00
}
2018-07-05 01:09:54 +08:00
void e2d::ActionManager::clearAllBindedWith(Node * target)
2017-10-19 00:50:04 +08:00
{
2018-05-08 17:40:36 +08:00
if (target)
{
2018-08-12 15:38:02 +08:00
auto iter = std::find_if(
_runningActions.begin(),
_runningActions.end(),
[target](Action* action) ->bool { return action->getTarget() == target; }
);
if (iter != _runningActions.end())
{
2018-08-12 15:38:02 +08:00
(*iter)->release();
_runningActions.erase(iter);
}
}
2017-10-19 00:50:04 +08:00
}
void e2d::ActionManager::clearAll()
2017-10-19 00:50:04 +08:00
{
if (!_runningActions.empty())
2017-10-21 19:09:31 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
{
2018-07-22 21:22:27 +08:00
action->release();
}
_runningActions.clear();
2017-10-21 19:09:31 +08:00
}
_actions.clear();
2017-10-19 00:50:04 +08:00
}
std::vector<e2d::Action*> e2d::ActionManager::get(const String& name)
2017-10-19 00:50:04 +08:00
{
2018-05-10 00:58:43 +08:00
std::vector<Action*> actions;
2018-08-12 14:30:28 +08:00
for (const auto& action : _actions)
{
if (action->getName() == name)
2018-03-06 09:56:17 +08:00
{
2018-05-10 00:58:43 +08:00
actions.push_back(action);
2018-03-06 09:56:17 +08:00
}
}
2018-05-10 00:58:43 +08:00
return std::move(actions);
2017-10-19 00:50:04 +08:00
}
2018-05-10 14:16:36 +08:00
const std::vector<e2d::Action*>& e2d::ActionManager::getAll()
2017-10-19 00:50:04 +08:00
{
2018-07-05 01:09:54 +08:00
return _actions;
2018-03-06 09:56:17 +08:00
}
void e2d::ActionManager::updateTime()
2018-03-06 09:56:17 +08:00
{
2018-08-12 14:30:28 +08:00
for (const auto& action : _runningActions)
{
2018-03-06 09:56:17 +08:00
action->_resetTime();
}
2017-10-19 00:50:04 +08:00
}