264 lines
5.0 KiB
C++
264 lines
5.0 KiB
C++
#include "..\etools.h"
|
|
#include "..\enodes.h"
|
|
#include "..\Win\winbase.h"
|
|
|
|
static e2d::EVector<e2d::ETimer*> s_vTimers;
|
|
|
|
void e2d::ETimerManager::bindTimer(ETimer * timer, EScene * pParentScene)
|
|
{
|
|
ASSERT(
|
|
(!timer->m_pParentScene) && (!timer->m_pParentNode),
|
|
"The timer is already binded, it cannot bind again!"
|
|
);
|
|
WARN_IF(timer == nullptr, "ETimer NULL pointer exception!");
|
|
WARN_IF(pParentScene == nullptr, "Bind ETimer with a NULL EScene pointer!");
|
|
|
|
if (timer && pParentScene)
|
|
{
|
|
timer->start();
|
|
timer->retain();
|
|
timer->m_pParentScene = pParentScene;
|
|
s_vTimers.push_back(timer);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::bindTimer(ETimer * timer, ENode * pParentNode)
|
|
{
|
|
ASSERT(
|
|
(!timer->m_pParentScene) && (!timer->m_pParentNode),
|
|
"The timer is already binded, it cannot bind again!"
|
|
);
|
|
WARN_IF(timer == nullptr, "ETimer NULL pointer exception!");
|
|
WARN_IF(pParentNode == nullptr, "Bind ETimer with a NULL ENode pointer!");
|
|
|
|
if (timer && pParentNode)
|
|
{
|
|
timer->start();
|
|
timer->retain();
|
|
timer->m_pParentNode = pParentNode;
|
|
s_vTimers.push_back(timer);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::startTimers(const EString & name)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getName() == name)
|
|
{
|
|
t->start();
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::stopTimers(const EString & name)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getName() == name)
|
|
{
|
|
t->stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::delTimers(const EString & name)
|
|
{
|
|
EVector<ETimer*>::iterator mIter;
|
|
for (mIter = s_vTimers.begin(); mIter != s_vTimers.end();)
|
|
{
|
|
if ((*mIter)->getName() == name)
|
|
{
|
|
SafeRelease(&(*mIter));
|
|
mIter = s_vTimers.erase(mIter);
|
|
}
|
|
else
|
|
{
|
|
mIter++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::startAllTimersBindedWith(EScene * pParentScene)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentScene() == pParentScene)
|
|
{
|
|
t->start();
|
|
}
|
|
}
|
|
for (auto child : pParentScene->getChildren())
|
|
{
|
|
ETimerManager::startAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::stopAllTimersBindedWith(EScene * pParentScene)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentScene() == pParentScene)
|
|
{
|
|
t->stop();
|
|
}
|
|
}
|
|
for (auto child : pParentScene->getChildren())
|
|
{
|
|
ETimerManager::stopAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::clearAllTimersBindedWith(EScene * pParentScene)
|
|
{
|
|
for (size_t i = 0; i < s_vTimers.size();)
|
|
{
|
|
auto t = s_vTimers[i];
|
|
if (t->getParentScene() == pParentScene)
|
|
{
|
|
SafeRelease(&t);
|
|
s_vTimers.erase(s_vTimers.begin() + i);
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
for (auto child : pParentScene->getChildren())
|
|
{
|
|
ETimerManager::clearAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::startAllTimersBindedWith(ENode * pParentNode)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentNode() == pParentNode)
|
|
{
|
|
t->start();
|
|
}
|
|
}
|
|
for (auto child : pParentNode->getChildren())
|
|
{
|
|
ETimerManager::startAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::stopAllTimersBindedWith(ENode * pParentNode)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentNode() == pParentNode)
|
|
{
|
|
t->stop();
|
|
}
|
|
}
|
|
for (auto child : pParentNode->getChildren())
|
|
{
|
|
ETimerManager::startAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::clearAllTimersBindedWith(ENode * pParentNode)
|
|
{
|
|
for (size_t i = 0; i < s_vTimers.size();)
|
|
{
|
|
auto t = s_vTimers[i];
|
|
if (t->getParentNode() == pParentNode)
|
|
{
|
|
SafeRelease(&t);
|
|
s_vTimers.erase(s_vTimers.begin() + i);
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
for (auto child : pParentNode->getChildren())
|
|
{
|
|
ETimerManager::clearAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::_notifyAllTimersBindedWith(EScene * pParentScene)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentScene() == pParentScene)
|
|
t->_notify();
|
|
}
|
|
for (auto child : pParentScene->getChildren())
|
|
{
|
|
_notifyAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::_waitAllTimersBindedWith(EScene * pParentScene)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentScene() == pParentScene)
|
|
t->_wait();
|
|
}
|
|
for (auto child : pParentScene->getChildren())
|
|
{
|
|
_waitAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::_notifyAllTimersBindedWith(ENode * pParentNode)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentNode() == pParentNode)
|
|
t->_notify();
|
|
}
|
|
for (auto child : pParentNode->getChildren())
|
|
{
|
|
_notifyAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::_waitAllTimersBindedWith(ENode * pParentNode)
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->getParentNode() == pParentNode)
|
|
t->_notify();
|
|
}
|
|
for (auto child : pParentNode->getChildren())
|
|
{
|
|
_waitAllTimersBindedWith(child);
|
|
}
|
|
}
|
|
|
|
void e2d::ETimerManager::startAllTimers()
|
|
{
|
|
ETimerManager::startAllTimersBindedWith(EApp::getCurrentScene());
|
|
}
|
|
|
|
void e2d::ETimerManager::stopAllTimers()
|
|
{
|
|
ETimerManager::stopAllTimersBindedWith(EApp::getCurrentScene());
|
|
}
|
|
|
|
void e2d::ETimerManager::clearAllTimers()
|
|
{
|
|
ETimerManager::clearAllTimersBindedWith(EApp::getCurrentScene());
|
|
}
|
|
|
|
void e2d::ETimerManager::TimerProc()
|
|
{
|
|
for (auto t : s_vTimers)
|
|
{
|
|
if (t->isRunning())
|
|
{
|
|
if (GetInterval(t->m_tLast) >= t->m_nInterval)
|
|
{
|
|
t->_callOn();
|
|
t->m_tLast = GetNow();
|
|
}
|
|
}
|
|
}
|
|
} |