224 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			224 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #include "..\easy2d.h"
 | |||
|  | #include "..\Win\winbase.h"
 | |||
|  | 
 | |||
|  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | static std::vector<Timer*> s_vTimers; | |||
|  | 
 | |||
|  | Timer::Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback) : | |||
|  | 	m_sName(name), | |||
|  | 	m_bRunning(false), | |||
|  | 	m_bWaiting(false), | |||
|  | 	m_callback(callback), | |||
|  | 	m_pParentScene(nullptr) | |||
|  | { | |||
|  | 	setInterval(milliSeconds);		// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | } | |||
|  | 
 | |||
|  | Timer::~Timer() | |||
|  | { | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::start() | |||
|  | { | |||
|  | 	// <20><>־<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	m_bRunning = true; | |||
|  | 	// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
 | |||
|  | 	m_nLast = steady_clock::now(); | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::stop() | |||
|  | { | |||
|  | 	m_bRunning = false;	// <20><>־<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֹͣ
 | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::wait() | |||
|  | { | |||
|  | 	m_bWaiting = true; | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::notify() | |||
|  | { | |||
|  | 	m_bWaiting = false; | |||
|  | } | |||
|  | 
 | |||
|  | bool Timer::isRunning() | |||
|  | { | |||
|  | 	return m_bRunning && !m_bWaiting;			// <20><>ȡ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
 | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::setInterval(LONGLONG milliSeconds) | |||
|  | { | |||
|  | 	// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	m_nAnimationInterval = milliSeconds; | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::setCallback(const TIMER_CALLBACK & callback) | |||
|  | { | |||
|  | 	m_callback = callback;		// <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::setName(TString name) | |||
|  | { | |||
|  | 	m_sName = name;				// <20>Ķ<DEB8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | } | |||
|  | 
 | |||
|  | LONGLONG Timer::getInterval() const | |||
|  | { | |||
|  | 	return m_nAnimationInterval;// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | } | |||
|  | 
 | |||
|  | TString Timer::getName() const | |||
|  | { | |||
|  | 	return m_sName;				// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::__exec() | |||
|  | { | |||
|  | 	// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
 | |||
|  | 	if (!s_vTimers.size()) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (auto timer : s_vTimers) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 		if (!timer->isRunning())  | |||
|  | 		{ | |||
|  | 			continue; | |||
|  | 		} | |||
|  | 		// <20>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
 | |||
|  | 		while (duration_cast<milliseconds>(GetNow() - timer->m_nLast).count() > timer->m_nAnimationInterval) | |||
|  | 		{ | |||
|  | 			// <20><><EFBFBD>¼<EFBFBD>¼ʱ<C2BC><CAB1>
 | |||
|  | 			timer->m_nLast += milliseconds(timer->m_nAnimationInterval); | |||
|  | 			// <20><><EFBFBD>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 			timer->m_callback(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::addTimer(Timer * timer) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	timer->start(); | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	timer->m_pParentScene = EApp::getLoadingScene(); | |||
|  | 	// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	s_vTimers.push_back(timer); | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::addTimer(TString name, const TIMER_CALLBACK & callback) | |||
|  | { | |||
|  | 	addTimer(name, 20, callback); | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	auto timer = new Timer(name, milliSeconds, callback); | |||
|  | 	// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	addTimer(timer); | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::startTimer(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (auto timer : s_vTimers) | |||
|  | 	{ | |||
|  | 		if (timer->m_sName == name && timer->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 			timer->start(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::stopTimer(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (auto timer : s_vTimers) | |||
|  | 	{ | |||
|  | 		if (timer->m_sName == name && timer->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			// ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
 | |||
|  | 			timer->stop(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::delTimer(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	std::vector<Timer*>::iterator iter; | |||
|  | 	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (iter = s_vTimers.begin(); iter != s_vTimers.end();) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1>
 | |||
|  | 		if ((*iter)->m_sName == name && (*iter)->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 			delete (*iter); | |||
|  | 			iter = s_vTimers.erase(iter); | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			iter++; | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::clearAllTimers() | |||
|  | { | |||
|  | 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (auto t : s_vTimers) | |||
|  | 	{ | |||
|  | 		delete t; | |||
|  | 	} | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	s_vTimers.clear(); | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::notifyAllSceneTimers(EScene * scene) | |||
|  | { | |||
|  | 	for (auto t : s_vTimers) | |||
|  | 	{ | |||
|  | 		if (t->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			t->notify(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::waitAllSceneTimers(EScene * scene) | |||
|  | { | |||
|  | 	for (auto t : s_vTimers) | |||
|  | 	{ | |||
|  | 		if (t->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			t->wait(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void Timer::clearAllSceneTimers(EScene * scene) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	std::vector<Timer*>::iterator iter; | |||
|  | 	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 	for (iter = s_vTimers.begin(); iter != s_vTimers.end();) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1>
 | |||
|  | 		if ((*iter)->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 			delete (*iter); | |||
|  | 			iter = s_vTimers.erase(iter); | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			iter++; | |||
|  | 		} | |||
|  | 	} | |||
|  | } |