2017-09-27 17:56:28 +08:00
|
|
|
|
#include "..\easy2d.h"
|
2017-09-10 23:56:52 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
static std::vector<Timer*> s_vTimers;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
Timer::Timer(TString name, UINT ms, const TIMER_CALLBACK & callback) :
|
2017-09-10 23:56:52 +08:00
|
|
|
|
m_sName(name),
|
|
|
|
|
|
m_bRunning(false),
|
2017-10-08 12:30:45 +08:00
|
|
|
|
m_bWaiting(false),
|
2017-10-06 02:32:33 +08:00
|
|
|
|
m_callback(callback),
|
|
|
|
|
|
m_pParentScene(nullptr)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
setInterval(ms); // <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>
|
2017-10-08 12:30:45 +08:00
|
|
|
|
m_bRunning = true;
|
2017-09-10 23:56:52 +08:00
|
|
|
|
// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
|
|
|
|
|
|
QueryPerformanceCounter(&m_nLast);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Timer::stop()
|
|
|
|
|
|
{
|
2017-10-08 12:30:45 +08:00
|
|
|
|
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()
|
|
|
|
|
|
{
|
2017-10-08 12:30:45 +08:00
|
|
|
|
return m_bRunning && !m_bWaiting; // <20><>ȡ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Timer::setInterval(UINT ms)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
LARGE_INTEGER nFreq;
|
|
|
|
|
|
QueryPerformanceFrequency(&nFreq);
|
|
|
|
|
|
m_nAnimationInterval.QuadPart = (LONGLONG)(ms / 1000.0 * nFreq.QuadPart);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
this->m_nMilliSeconds = ms;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Timer::setCallback(const TIMER_CALLBACK & callback)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_callback = callback; // <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void Timer::setName(TString name)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_sName = name; // <20>Ķ<DEB8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT Timer::getInterval() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_nMilliSeconds; // <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +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>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
if (!s_vTimers.size())
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
|
|
|
|
|
|
static LARGE_INTEGER nNow;
|
|
|
|
|
|
QueryPerformanceCounter(&nNow);
|
|
|
|
|
|
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5>ʱ<EFBFBD><CAB1>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
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>
|
2017-10-08 12:30:45 +08:00
|
|
|
|
if (!timer->isRunning())
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
|
|
|
|
|
if (nNow.QuadPart - timer->m_nLast.QuadPart > timer->m_nAnimationInterval.QuadPart)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>¼ʱ<C2BC><CAB1>
|
|
|
|
|
|
timer->m_nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % timer->m_nAnimationInterval.QuadPart);
|
|
|
|
|
|
// <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>
|
2017-10-08 12:30:45 +08:00
|
|
|
|
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>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
s_vTimers.push_back(timer);
|
2017-09-10 23:56:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-05 00:53:03 +08:00
|
|
|
|
void Timer::addTimer(TString name, UINT ms, const TIMER_CALLBACK & callback)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
auto timer = new Timer(name, ms, callback);
|
|
|
|
|
|
// <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>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
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>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
for (auto t : s_vTimers)
|
2017-09-10 23:56:52 +08:00
|
|
|
|
{
|
|
|
|
|
|
delete t;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2017-10-06 02:32:33 +08:00
|
|
|
|
s_vTimers.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-08 12:30:45 +08:00
|
|
|
|
void Timer::notifyAllSceneTimers(Scene * scene)
|
2017-10-06 02:32:33 +08:00
|
|
|
|
{
|
|
|
|
|
|
for (auto t : s_vTimers)
|
|
|
|
|
|
{
|
2017-10-06 16:40:10 +08:00
|
|
|
|
if (t->m_pParentScene == scene)
|
2017-10-06 02:32:33 +08:00
|
|
|
|
{
|
2017-10-08 12:30:45 +08:00
|
|
|
|
t->notify();
|
2017-10-06 02:32:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-08 12:30:45 +08:00
|
|
|
|
void Timer::waitAllSceneTimers(Scene * scene)
|
2017-10-06 02:32:33 +08:00
|
|
|
|
{
|
|
|
|
|
|
for (auto t : s_vTimers)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (t->m_pParentScene == scene)
|
|
|
|
|
|
{
|
2017-10-08 12:30:45 +08:00
|
|
|
|
t->wait();
|
2017-10-06 02:32:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
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++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|