Magic_Game/core/Manager/ActionManager.cpp

239 lines
4.1 KiB
C++

#include "..\e2dmanager.h"
#include "..\e2daction.h"
static std::vector<e2d::Action*> s_vActions;
static std::vector<e2d::Action*> s_vRunningActions;
void e2d::ActionManager::__update()
{
if (s_vRunningActions.empty() || Game::isPaused())
return;
// 循环遍历所有正在运行的动作
for (size_t i = 0; i < s_vRunningActions.size(); i++)
{
auto action = s_vRunningActions[i];
// 获取动作运行状态
if (action->_isDone())
{
// 动作已经结束
action->release();
action->_target = nullptr;
s_vRunningActions.erase(s_vRunningActions.begin() + i);
}
else
{
if (action->isRunning())
{
// 执行动作
action->_update();
}
}
}
}
void e2d::ActionManager::__add(Action * action)
{
if (action)
{
s_vActions.push_back(action);
}
}
void e2d::ActionManager::__remove(Action * action)
{
for (size_t i = 0; i < s_vActions.size();)
{
if (s_vActions[i] == action)
{
s_vActions.erase(s_vActions.begin() + i);
}
else
{
i++;
}
}
}
void e2d::ActionManager::__resumeAllBindedWith(Node * target)
{
if (target)
{
for (auto action : s_vRunningActions)
{
if (action->getTarget() == target)
{
action->resume();
}
}
}
}
void e2d::ActionManager::__pauseAllBindedWith(Node * target)
{
if (target)
{
for (auto action : s_vRunningActions)
{
if (action->getTarget() == target)
{
action->pause();
}
}
}
}
void e2d::ActionManager::__stopAllBindedWith(Node * target)
{
if (target)
{
for (auto action : s_vRunningActions)
{
if (action->getTarget() == target)
{
action->stop();
}
}
}
}
void e2d::ActionManager::start(Action * action, Node * target, bool paused)
{
WARN_IF(action == nullptr, "Action NULL pointer exception!");
WARN_IF(target == nullptr, "Target node NULL pointer exception!");
if (action && target)
{
ASSERT([](Action * newAction)
{
for (const auto& action : s_vRunningActions)
{
if (newAction == action)
{
return false;
}
}
return true;
}(action), "action already be added!");
action->_startWithTarget(target);
action->retain();
action->_running = !paused;
s_vRunningActions.push_back(action);
}
}
void e2d::ActionManager::resume(const String& strActionName)
{
for (auto action : s_vRunningActions)
{
if (action->getName() == strActionName)
{
action->resume();
}
}
}
void e2d::ActionManager::pause(const String& strActionName)
{
for (auto action : s_vRunningActions)
{
if (action->getName() == strActionName)
{
action->pause();
}
}
}
void e2d::ActionManager::stop(const String& strActionName)
{
for (auto action : s_vRunningActions)
{
if (action->getName() == strActionName)
{
action->stop();
}
}
}
void e2d::ActionManager::__clearAllBindedWith(Node * target)
{
if (target)
{
for (size_t i = 0; i < s_vRunningActions.size();)
{
auto a = s_vRunningActions[i];
if (a->getTarget() == target)
{
SafeRelease(a);
s_vRunningActions.erase(s_vRunningActions.begin() + i);
}
else
{
i++;
}
}
}
}
void e2d::ActionManager::__uninit()
{
for (auto action : s_vRunningActions)
{
SafeRelease(action);
}
s_vActions.clear();
s_vRunningActions.clear();
}
void e2d::ActionManager::resumeAll()
{
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
{
ActionManager::__resumeAllBindedWith(child);
}
}
void e2d::ActionManager::pauseAll()
{
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
{
ActionManager::__pauseAllBindedWith(child);
}
}
void e2d::ActionManager::stopAll()
{
for (auto child : SceneManager::getCurrentScene()->getRoot()->getAllChildren())
{
ActionManager::__stopAllBindedWith(child);
}
}
std::vector<e2d::Action*> e2d::ActionManager::get(const String& strActionName)
{
std::vector<Action*> actions;
for (auto action : s_vActions)
{
if (action->getName() == strActionName)
{
actions.push_back(action);
}
}
return std::move(actions);
}
const std::vector<e2d::Action*>& e2d::ActionManager::getAll()
{
return s_vActions;
}
void e2d::ActionManager::__resetAll()
{
for (auto action : s_vRunningActions)
{
action->_resetTime();
}
}