Magic_Game/core/Manager/TimerManager.cpp

169 lines
3.3 KiB
C++
Raw Normal View History

#include "..\emanagers.h"
2017-10-17 21:22:25 +08:00
#include "..\etools.h"
#include "..\enodes.h"
static std::vector<e2d::Timer*> s_vTimers;
2017-10-17 21:22:25 +08:00
2017-10-21 19:09:31 +08:00
void e2d::TimerManager::__update()
2017-10-21 19:09:31 +08:00
{
if (s_vTimers.empty() || Game::isPaused())
2017-10-21 19:09:31 +08:00
return;
for (auto &timer : s_vTimers)
2017-10-21 19:09:31 +08:00
{
if (timer->_isReady())
2017-10-21 19:09:31 +08:00
{
timer->_callOn();
2017-10-21 19:09:31 +08:00
}
}
}
2018-03-03 11:46:57 +08:00
void e2d::TimerManager::add(double timeOut, TimerCallback callback)
2017-10-17 21:22:25 +08:00
{
2018-03-03 11:46:57 +08:00
auto pTimer = new Timer(callback, timeOut, 0, false);
TimerManager::add(pTimer, SceneManager::getCurrentScene());
2017-10-17 21:22:25 +08:00
}
2018-03-03 11:46:57 +08:00
void e2d::TimerManager::add(Timer * pTimer, Scene * pParentScene)
{
WARN_IF(pParentScene == nullptr, "Bind Timer with a NULL Scene pointer!");
if (pParentScene)
{
TimerManager::add(pTimer, pParentScene->getRoot());
}
}
void e2d::TimerManager::add(Timer * pTimer, Node * pParentNode)
2017-10-17 21:22:25 +08:00
{
WARN_IF(pTimer == nullptr, "Timer NULL pointer exception!");
WARN_IF(pParentNode == nullptr, "Bind Timer with a NULL Node pointer!");
2017-10-17 21:22:25 +08:00
if (pTimer && pParentNode)
2017-10-17 21:22:25 +08:00
{
ASSERT(
2018-03-03 11:46:57 +08:00
pTimer->m_pParentNode != nullptr,
"The timer is already binded, cannot be binded again!"
);
pTimer->start();
pTimer->retain();
pTimer->m_pParentNode = pParentNode;
s_vTimers.push_back(pTimer);
2017-10-17 21:22:25 +08:00
}
}
void e2d::TimerManager::startTimers(const String & name)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
for (auto timer : s_vTimers)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
if (timer->getName() == name)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
timer->start();
2017-10-17 21:22:25 +08:00
}
}
}
void e2d::TimerManager::stopTimers(const String & name)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
for (auto timer : s_vTimers)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
if (timer->getName() == name)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
timer->stop();
2017-10-17 21:22:25 +08:00
}
}
}
void e2d::TimerManager::deleteTimers(const String & name)
2017-10-17 21:22:25 +08:00
{
std::vector<Timer*>::iterator mIter;
2017-10-17 21:22:25 +08:00
for (mIter = s_vTimers.begin(); mIter != s_vTimers.end();)
{
if ((*mIter)->getName() == name)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&(*mIter));
2017-10-17 21:22:25 +08:00
mIter = s_vTimers.erase(mIter);
}
else
{
mIter++;
}
}
}
void e2d::TimerManager::startAllTimersBindedWith(Scene * pParentScene)
2017-10-17 21:22:25 +08:00
{
TimerManager::startAllTimersBindedWith(pParentScene->getRoot());
2017-10-17 21:22:25 +08:00
}
void e2d::TimerManager::stopAllTimersBindedWith(Scene * pParentScene)
2017-10-17 21:22:25 +08:00
{
TimerManager::stopAllTimersBindedWith(pParentScene->getRoot());
2017-10-17 21:22:25 +08:00
}
void e2d::TimerManager::startAllTimersBindedWith(Node * pParentNode)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
for (auto timer : s_vTimers)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
if (timer->getParentNode() == pParentNode)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
timer->start();
2017-10-17 21:22:25 +08:00
}
}
2017-12-15 21:51:07 +08:00
for (auto child = pParentNode->getChildren().begin(); child != pParentNode->getChildren().end(); child++)
2017-10-17 21:22:25 +08:00
{
TimerManager::startAllTimersBindedWith((*child));
2017-10-17 21:22:25 +08:00
}
}
void e2d::TimerManager::stopAllTimersBindedWith(Node * pParentNode)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
for (auto timer : s_vTimers)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
if (timer->getParentNode() == pParentNode)
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
timer->stop();
2017-10-17 21:22:25 +08:00
}
}
2018-02-03 22:04:43 +08:00
for (auto child : pParentNode->getChildren())
2017-10-17 21:22:25 +08:00
{
TimerManager::stopAllTimersBindedWith(child);
2017-10-17 21:22:25 +08:00
}
}
void e2d::TimerManager::__clearAllTimersBindedWith(Node * pParentNode)
2017-10-17 21:22:25 +08:00
{
for (size_t i = 0; i < s_vTimers.size();)
{
auto t = s_vTimers[i];
if (t->getParentNode() == pParentNode)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&t);
2017-10-17 21:22:25 +08:00
s_vTimers.erase(s_vTimers.begin() + i);
}
else
{
i++;
}
}
}
void e2d::TimerManager::__resetAllTimers()
2017-10-17 21:22:25 +08:00
{
2018-02-03 22:04:43 +08:00
for (auto timer : s_vTimers)
2017-10-17 21:22:25 +08:00
{
timer->m_fLast = Time::getTotalTime();
2017-10-17 21:22:25 +08:00
}
}
void e2d::TimerManager::startAllTimers()
2017-10-17 21:22:25 +08:00
{
TimerManager::startAllTimersBindedWith(SceneManager::getCurrentScene());
2017-10-17 21:22:25 +08:00
}
void e2d::TimerManager::stopAllTimers()
2017-10-17 21:22:25 +08:00
{
TimerManager::stopAllTimersBindedWith(SceneManager::getCurrentScene());
2017-10-17 21:22:25 +08:00
}