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)
 | |
| 		{
 | |
| 			(*mIter)->autoRelease();
 | |
| 			(*mIter)->release();
 | |
| 			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)
 | |
| 		{
 | |
| 			t->autoRelease();
 | |
| 			t->release();
 | |
| 			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)
 | |
| 		{
 | |
| 			t->autoRelease();
 | |
| 			t->release();
 | |
| 			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 (GetInterval(t->m_tLast) >= t->m_nInterval)
 | |
| 		{
 | |
| 			t->_runCallback();
 | |
| 			t->m_tLast = GetNow();
 | |
| 		}
 | |
| 	}
 | |
| } |