2017-10-26 17:17:30 +08:00
|
|
|
|
#include "..\emanagers.h"
|
2017-10-19 12:48:58 +08:00
|
|
|
|
#include "..\eactions.h"
|
2017-10-19 00:50:04 +08:00
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
static std::vector<e2d::Action*> s_vActions;
|
2018-03-06 09:56:17 +08:00
|
|
|
|
static std::vector<e2d::Action*> s_vRunningActions;
|
2017-10-19 00:50:04 +08:00
|
|
|
|
|
2017-10-19 12:48:58 +08:00
|
|
|
|
|
2018-03-06 09:56:17 +08:00
|
|
|
|
void e2d::ActionManager::__update()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (s_vRunningActions.empty() || Game::isPaused())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5><C4B6><EFBFBD>
|
|
|
|
|
|
for (size_t i = 0; i < s_vRunningActions.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
auto action = s_vRunningActions[i];
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
2018-03-11 23:56:40 +08:00
|
|
|
|
if (action->_isEnding())
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
action->release();
|
|
|
|
|
|
action->m_pTarget = nullptr;
|
|
|
|
|
|
s_vRunningActions.erase(s_vRunningActions.begin() + i);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (action->isRunning())
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
// ִ<>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
action->_update();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::ActionManager::__add(Action * pAction)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pAction)
|
|
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (action == pAction)
|
|
|
|
|
|
{
|
|
|
|
|
|
WARN_IF(true, "ActionManager::add Failed!The action is already added.");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
s_vActions.push_back(pAction);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::ActionManager::__remove(Action * pAction)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (size_t i = 0; i < s_vActions.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (s_vActions[i] == pAction)
|
|
|
|
|
|
{
|
|
|
|
|
|
s_vActions.erase(s_vActions.begin() + i);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::ActionManager::__startAction(Action * pAction, Node * pTargetNode)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-02-07 16:37:12 +08:00
|
|
|
|
WARN_IF(pAction == nullptr, "Action NULL pointer exception!");
|
2017-10-19 12:48:58 +08:00
|
|
|
|
|
2018-02-06 15:34:47 +08:00
|
|
|
|
if (pAction)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
pAction->setTarget(pTargetNode);
|
2018-02-06 15:34:47 +08:00
|
|
|
|
pAction->retain();
|
2018-03-06 09:56:17 +08:00
|
|
|
|
s_vRunningActions.push_back(pAction);
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::__resumeAllBindedWith(Node * pTargetNode)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2017-10-21 19:09:31 +08:00
|
|
|
|
if (pTargetNode)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-02-03 22:04:43 +08:00
|
|
|
|
if (action->getTarget() == pTargetNode)
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-02-06 15:34:47 +08:00
|
|
|
|
action->resume();
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::__pauseAllBindedWith(Node * pTargetNode)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2017-10-19 12:48:58 +08:00
|
|
|
|
if (pTargetNode)
|
|
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-02-03 22:04:43 +08:00
|
|
|
|
if (action->getTarget() == pTargetNode)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-02-03 22:04:43 +08:00
|
|
|
|
action->pause();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::__stopAllBindedWith(Node * pTargetNode)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2017-10-19 12:48:58 +08:00
|
|
|
|
if (pTargetNode)
|
|
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-02-03 22:04:43 +08:00
|
|
|
|
if (action->getTarget() == pTargetNode)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-02-03 22:04:43 +08:00
|
|
|
|
action->stop();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-03-06 09:56:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
void e2d::ActionManager::resume(String strActionName)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (action->getName() == strActionName)
|
|
|
|
|
|
{
|
|
|
|
|
|
action->resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
void e2d::ActionManager::pause(String strActionName)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (action->getName() == strActionName)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
action->pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
void e2d::ActionManager::stop(String strActionName)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (action->getName() == strActionName)
|
|
|
|
|
|
{
|
|
|
|
|
|
action->stop();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::__clearAllBindedWith(Node * pTargetNode)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2017-10-19 12:48:58 +08:00
|
|
|
|
if (pTargetNode)
|
|
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
for (size_t i = 0; i < s_vRunningActions.size();)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
auto a = s_vRunningActions[i];
|
2017-10-19 12:48:58 +08:00
|
|
|
|
if (a->getTarget() == pTargetNode)
|
|
|
|
|
|
{
|
2017-10-31 17:19:13 +08:00
|
|
|
|
SafeRelease(&a);
|
2018-03-06 09:56:17 +08:00
|
|
|
|
s_vRunningActions.erase(s_vRunningActions.begin() + i);
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
i++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::resumeAll()
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
ActionManager::__resumeAllBindedWith(child);
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::pauseAll()
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
ActionManager::__pauseAllBindedWith(child);
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::stopAll()
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(child, SceneManager::getCurrentScene()->getRoot()->getChildren())
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
ActionManager::__stopAllBindedWith(child);
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
std::vector<e2d::Action*> e2d::ActionManager::get(String strActionName)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
std::vector<Action*> vActions;
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
if (action->getName() == strActionName)
|
|
|
|
|
|
{
|
|
|
|
|
|
vActions.push_back(action);
|
|
|
|
|
|
}
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
2018-03-06 09:56:17 +08:00
|
|
|
|
return std::move(vActions);
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-13 13:13:26 +08:00
|
|
|
|
std::vector<e2d::Action*> e2d::ActionManager::getAll()
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
return s_vActions;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::ActionManager::__resetAllActions()
|
|
|
|
|
|
{
|
2018-04-01 23:08:11 +08:00
|
|
|
|
FOR_LOOP(action, s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
action->_resetTime();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|