Magic_Game/Easy2D/Tool/Timer.cpp

224 lines
3.7 KiB
C++
Raw Normal View History

2017-09-27 17:56:28 +08:00
#include "..\easy2d.h"
2017-10-10 01:14:03 +08:00
#include "..\Win\winbase.h"
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static std::vector<Timer*> s_vTimers;
2017-09-10 23:56:52 +08:00
2017-10-10 01:14:03 +08:00
Timer::Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback) :
2017-09-10 23:56:52 +08:00
m_sName(name),
m_bRunning(false),
m_bWaiting(false),
m_callback(callback),
m_pParentScene(nullptr)
2017-09-10 23:56:52 +08:00
{
2017-10-10 01:14:03 +08:00
setInterval(milliSeconds); // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-09-10 23:56:52 +08:00
}
Timer::~Timer()
{
}
void Timer::start()
{
// <20><>־<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bRunning = true;
2017-09-10 23:56:52 +08:00
// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
2017-10-10 01:14:03 +08:00
m_nLast = steady_clock::now();
2017-09-10 23:56:52 +08:00
}
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;
2017-09-10 23:56:52 +08:00
}
bool Timer::isRunning()
{
return m_bRunning && !m_bWaiting; // <20><>ȡ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
2017-09-10 23:56:52 +08:00
}
2017-10-10 01:14:03 +08:00
void Timer::setInterval(LONGLONG milliSeconds)
2017-09-10 23:56:52 +08:00
{
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-10-10 01:14:03 +08:00
m_nAnimationInterval = milliSeconds;
2017-09-10 23:56:52 +08:00
}
void Timer::setCallback(const TIMER_CALLBACK & callback)
{
m_callback = callback; // <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
void Timer::setName(TString name)
2017-09-10 23:56:52 +08:00
{
m_sName = name; // <20>޸Ķ<DEB8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
2017-10-10 01:14:03 +08:00
LONGLONG Timer::getInterval() const
2017-09-10 23:56:52 +08:00
{
2017-10-10 01:14:03 +08:00
return m_nAnimationInterval;// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-09-10 23:56:52 +08:00
}
TString Timer::getName() const
2017-09-10 23:56:52 +08:00
{
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())
2017-09-10 23:56:52 +08:00
{
return;
}
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5>ʱ<EFBFBD><CAB1>
for (auto timer : s_vTimers)
2017-09-10 23:56:52 +08:00
{
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (!timer->isRunning())
2017-09-10 23:56:52 +08:00
{
continue;
}
// <20>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>
2017-10-10 08:54:25 +08:00
while (duration_cast<milliseconds>(GetNow() - timer->m_nLast).count() > timer->m_nAnimationInterval)
2017-09-10 23:56:52 +08:00
{
2017-10-10 01:14:03 +08:00
// <20><><EFBFBD>¼<EFBFBD>¼ʱ<C2BC><CAB1>
timer->m_nLast += milliseconds(timer->m_nAnimationInterval);
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
timer->m_callback();
}
}
}
void Timer::addTimer(Timer * timer)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
timer->start();
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>
timer->m_pParentScene = App::getLoadingScene();
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_vTimers.push_back(timer);
2017-09-10 23:56:52 +08:00
}
void Timer::addTimer(TString name, const TIMER_CALLBACK & callback)
{
addTimer(name, 20, callback);
}
2017-10-10 01:14:03 +08:00
void Timer::addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback)
2017-09-10 23:56:52 +08:00
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
2017-10-10 01:14:03 +08:00
auto timer = new Timer(name, milliSeconds, callback);
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
addTimer(timer);
}
2017-10-06 16:40:10 +08:00
void Timer::startTimer(TString name)
2017-09-10 23:56:52 +08:00
{
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
for (auto timer : s_vTimers)
2017-09-10 23:56:52 +08:00
{
2017-10-06 16:40:10 +08:00
if (timer->m_sName == name && timer->m_pParentScene == App::getCurrentScene())
2017-09-10 23:56:52 +08:00
{
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
timer->start();
2017-09-10 23:56:52 +08:00
}
}
}
2017-10-06 16:40:10 +08:00
void Timer::stopTimer(TString name)
2017-09-10 23:56:52 +08:00
{
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
for (auto timer : s_vTimers)
2017-09-10 23:56:52 +08:00
{
2017-10-06 16:40:10 +08:00
if (timer->m_sName == name && timer->m_pParentScene == App::getCurrentScene())
{
// ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
timer->stop();
}
2017-09-10 23:56:52 +08:00
}
}
2017-10-06 16:40:10 +08:00
void Timer::delTimer(TString name)
2017-09-10 23:56:52 +08:00
{
// <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>
2017-10-06 16:40:10 +08:00
for (iter = s_vTimers.begin(); iter != s_vTimers.end();)
2017-09-10 23:56:52 +08:00
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1>
2017-10-06 16:40:10 +08:00
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == App::getCurrentScene())
2017-09-10 23:56:52 +08:00
{
// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
delete (*iter);
2017-10-06 16:40:10 +08:00
iter = s_vTimers.erase(iter);
}
else
{
iter++;
2017-09-10 23:56:52 +08:00
}
}
}
void Timer::clearAllTimers()
{
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
for (auto t : s_vTimers)
2017-09-10 23:56:52 +08:00
{
delete t;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_vTimers.clear();
}
void Timer::notifyAllSceneTimers(Scene * scene)
{
for (auto t : s_vTimers)
{
2017-10-06 16:40:10 +08:00
if (t->m_pParentScene == scene)
{
t->notify();
}
}
}
void Timer::waitAllSceneTimers(Scene * scene)
{
for (auto t : s_vTimers)
{
if (t->m_pParentScene == scene)
{
t->wait();
}
}
2017-09-10 23:56:52 +08:00
}
2017-10-06 16:40:10 +08:00
void Timer::clearAllSceneTimers(Scene * 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++;
}
}
}