#include "..\emanagers.h" #include "..\etools.h" #include "..\enodes.h" static std::vector s_vTimers; void e2d::TimerManager::__update() { if (s_vTimers.empty() || Game::isPaused()) return; std::vector::iterator mIter; for (mIter = s_vTimers.begin(); mIter != s_vTimers.end();) { Timer * pTimer = (*mIter); // 更新定时器 if (pTimer->isReady()) { pTimer->update(); } // 清除不必要的定时器 if (pTimer->m_bClear) { pTimer->release(); mIter = s_vTimers.erase(mIter); } else { mIter++; } } } void e2d::TimerManager::add(double timeOut, TimerCallback callback) { auto pTimer = new Timer(callback, timeOut, 1, false, true); pTimer->start(); } void e2d::TimerManager::add(Timer * pTimer) { WARN_IF(pTimer == nullptr, "Timer NULL pointer exception!"); if (pTimer) { auto findTimer = [](Timer * pTimer) -> bool { for (const auto &t : s_vTimers) { if (pTimer == t) { return true; } } return false; }; bool bHasTimer = findTimer(pTimer); WARN_IF(bHasTimer, "The timer is already added, cannot be added again!"); if (!bHasTimer) { pTimer->retain(); s_vTimers.push_back(pTimer); } } } void e2d::TimerManager::start(const String & name) { for (auto timer : s_vTimers) { if (timer->getName() == name) { timer->start(); } } } void e2d::TimerManager::stop(const String & name) { for (auto timer : s_vTimers) { if (timer->getName() == name) { timer->stop(); } } } void e2d::TimerManager::stopAndClear(const String & name) { for (auto timer : s_vTimers) { if (timer->getName() == name) { timer->stopAndClear(); } } } e2d::Timer * e2d::TimerManager::get(const String & name) { for (auto timer : s_vTimers) { if (timer->getName() == name) { return timer; } } return nullptr; } std::vector e2d::TimerManager::getTimers(const String & name) { std::vector vTimers; for (auto timer : s_vTimers) { if (timer->getName() == name) { vTimers.push_back(timer); } } return std::move(vTimers); } void e2d::TimerManager::startAllTimers() { for (auto timer : s_vTimers) { timer->start(); } } void e2d::TimerManager::stopAllTimers() { for (auto timer : s_vTimers) { timer->stop(); } } void e2d::TimerManager::stopAndClearAllTimers() { for (auto timer : s_vTimers) { timer->stop(); timer->release(); } s_vTimers.clear(); } std::vector e2d::TimerManager::getAllTimers() { return s_vTimers; } void e2d::TimerManager::__resetAllTimers() { for (auto timer : s_vTimers) { timer->m_fLast = Time::getTotalTime(); } } void e2d::TimerManager::__uninit() { for (const auto timer : s_vTimers) { timer->release(); } s_vTimers.clear(); }