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-05-08 20:03:29 +08:00
|
|
|
|
static std::vector<e2d::Action*> s_vActions;
|
|
|
|
|
|
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>
|
2018-05-14 22:51:40 +08:00
|
|
|
|
for (size_t i = 0; i < s_vRunningActions.size(); ++i)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
auto action = s_vRunningActions[i];
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
2018-06-01 18:31:05 +08:00
|
|
|
|
if (action->_isDone() || action->_target->getRefCount() == 0)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-03-11 23:56:40 +08:00
|
|
|
|
action->release();
|
2018-05-08 20:03:29 +08:00
|
|
|
|
action->_target = nullptr;
|
2018-03-11 23:56:40 +08:00
|
|
|
|
s_vRunningActions.erase(s_vRunningActions.begin() + i);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (action->isRunning())
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
// ִ<>ж<EFBFBD><D0B6><EFBFBD>
|
|
|
|
|
|
action->_update();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 20:03:29 +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-05-08 17:40:36 +08:00
|
|
|
|
s_vActions.push_back(action);
|
2018-03-06 09:56:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 20:03:29 +08:00
|
|
|
|
void e2d::ActionManager::__remove(Action * action)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vActions.empty() || action == nullptr)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2018-05-21 23:04:58 +08:00
|
|
|
|
auto iter = std::find(s_vActions.begin(), s_vActions.end(), action);
|
|
|
|
|
|
if (iter != s_vActions.end())
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-21 23:04:58 +08:00
|
|
|
|
s_vActions.erase(iter);
|
2018-03-06 09:56:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
void e2d::ActionManager::__resumeAllBindedWith(Node * target)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || target == nullptr)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
for (auto action : s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getTarget() == target)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
action->resume();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
void e2d::ActionManager::__pauseAllBindedWith(Node * target)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || target == nullptr)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
for (auto action : s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getTarget() == target)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
action->pause();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
void e2d::ActionManager::__stopAllBindedWith(Node * target)
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || target == nullptr)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
for (auto action : s_vRunningActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getTarget() == target)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
action->stop();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
2018-03-06 09:56:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 20:03:29 +08:00
|
|
|
|
void e2d::ActionManager::start(Action * action, Node * target, bool paused)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
{
|
2018-05-08 20:03:29 +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)
|
|
|
|
|
|
{
|
|
|
|
|
|
auto iter = std::find(s_vRunningActions.begin(), s_vRunningActions.end(), action);
|
|
|
|
|
|
if (iter == s_vRunningActions.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
action->_startWithTarget(target);
|
|
|
|
|
|
action->retain();
|
|
|
|
|
|
action->_running = !paused;
|
|
|
|
|
|
s_vRunningActions.push_back(action);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
throw Exception(L"<EFBFBD><EFBFBD> Action <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>Ŀ<EFBFBD><C4BF>");
|
|
|
|
|
|
}
|
2018-05-08 17:40:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-22 00:11:57 +08:00
|
|
|
|
void e2d::ActionManager::resume(const String& name)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || name.isEmpty())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto action : s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getName() == name)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
action->resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-22 00:11:57 +08:00
|
|
|
|
void e2d::ActionManager::pause(const String& name)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || name.isEmpty())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto action : s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getName() == name)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-03-06 09:56:17 +08:00
|
|
|
|
action->pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-22 00:11:57 +08:00
|
|
|
|
void e2d::ActionManager::stop(const String& name)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (s_vRunningActions.empty() || name.isEmpty())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto action : s_vRunningActions)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
if (action->getName() == name)
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
action->stop();
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 17:40:36 +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)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
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];
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (a->getTarget() == target)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-19 01:10:37 +08:00
|
|
|
|
GC::release(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
|
|
|
|
|
|
{
|
2018-05-14 22:51:40 +08:00
|
|
|
|
++i;
|
2017-10-19 12:48:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-19 00:50:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-21 00:46:26 +08:00
|
|
|
|
void e2d::ActionManager::__uninit()
|
|
|
|
|
|
{
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto action : s_vRunningActions)
|
2018-04-21 00:46:26 +08:00
|
|
|
|
{
|
2018-05-19 01:10:37 +08:00
|
|
|
|
GC::release(action);
|
2018-04-21 00:46:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
s_vActions.clear();
|
|
|
|
|
|
s_vRunningActions.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-11 23:56:40 +08:00
|
|
|
|
void e2d::ActionManager::resumeAll()
|
2017-10-19 00:50:04 +08:00
|
|
|
|
{
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
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-24 20:22:41 +08:00
|
|
|
|
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
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-24 20:22:41 +08:00
|
|
|
|
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
|
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-05-22 00:11:57 +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-04-24 20:22:41 +08:00
|
|
|
|
for (auto action : s_vActions)
|
2017-10-19 12:48:58 +08:00
|
|
|
|
{
|
2018-05-22 00:11:57 +08:00
|
|
|
|
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
|
|
|
|
}
|
2017-10-19 12:48:58 +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-03-06 09:56:17 +08:00
|
|
|
|
return s_vActions;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 09:02:06 +08:00
|
|
|
|
void e2d::ActionManager::__resetAll()
|
2018-03-06 09:56:17 +08:00
|
|
|
|
{
|
2018-04-24 20:22:41 +08:00
|
|
|
|
for (auto 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
|
|
|
|
}
|