Magic_Game/core/Tool/Timer.cpp

147 lines
1.9 KiB
C++
Raw Normal View History

2018-04-21 21:24:46 +08:00
#include "..\e2dtool.h"
2017-10-17 21:22:25 +08:00
e2d::Timer * e2d::Timer::_instance = nullptr;
2018-04-24 09:02:06 +08:00
e2d::Timer * e2d::Timer::getInstance()
{
if (!_instance)
_instance = new (std::nothrow) Timer;
return _instance;
}
2018-04-24 09:02:06 +08:00
void e2d::Timer::destroyInstance()
{
if (_instance)
{
delete _instance;
_instance = nullptr;
}
}
2018-04-24 09:02:06 +08:00
e2d::Timer::Timer()
: _tasks()
2018-04-24 09:02:06 +08:00
{
}
e2d::Timer::~Timer()
{
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::addTask(Task * task)
2017-10-17 21:22:25 +08:00
{
if (task)
{
auto iter = std::find(_tasks.begin(), _tasks.end(), task);
if (iter == _tasks.end())
{
2018-07-07 01:43:41 +08:00
GC::retain(task);
task->updateTime();
_tasks.push_back(task);
}
}
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::pauseTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
for (auto task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->getName() == name)
2018-04-24 09:02:06 +08:00
{
task->pause();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::resumeTasks(const String& name)
2017-10-17 21:22:25 +08:00
{
for (auto task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->getName() == name)
2018-04-24 09:02:06 +08:00
{
task->resume();
2018-04-24 09:02:06 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
void e2d::Timer::removeTasks(const String& name)
2017-10-21 19:09:31 +08:00
{
for (auto task : _tasks)
2018-04-24 09:02:06 +08:00
{
if (task->getName() == name)
2018-04-24 09:02:06 +08:00
{
task->_stopped = true;
2018-04-24 09:02:06 +08:00
}
}
2017-10-21 19:09:31 +08:00
}
void e2d::Timer::pauseAllTasks()
{
for (auto task : _tasks)
{
task->pause();
}
}
void e2d::Timer::resumeAllTasks()
2017-10-21 19:09:31 +08:00
{
for (auto task : _tasks)
2018-04-24 09:02:06 +08:00
{
task->resume();
2018-04-24 09:02:06 +08:00
}
2017-10-21 19:09:31 +08:00
}
void e2d::Timer::removeAllTasks()
{
for (auto task : _tasks)
2018-04-24 09:02:06 +08:00
{
task->_stopped = true;
2018-04-24 09:02:06 +08:00
}
}
void e2d::Timer::clearAllTasks()
2017-10-17 21:22:25 +08:00
{
if (_tasks.empty())
return;
for (auto task : _tasks)
{
2018-07-07 01:43:41 +08:00
GC::release(task);
}
_tasks.clear();
2018-04-24 09:02:06 +08:00
}
2017-10-17 21:22:25 +08:00
void e2d::Timer::update()
2018-04-24 09:02:06 +08:00
{
if (_tasks.empty() || Game::getInstance()->isPaused())
2018-04-24 09:02:06 +08:00
return;
2017-10-17 21:22:25 +08:00
for (size_t i = 0; i < _tasks.size();)
2017-10-21 19:09:31 +08:00
{
auto task = _tasks[i];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (task->_stopped)
2018-03-03 17:02:08 +08:00
{
2018-07-07 01:43:41 +08:00
GC::release(task);
_tasks.erase(_tasks.begin() + i);
2018-03-03 17:02:08 +08:00
}
else
{
2018-04-24 09:02:06 +08:00
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (task->isReady())
2018-04-24 09:02:06 +08:00
{
task->update();
2018-04-24 09:02:06 +08:00
}
++i;
2018-03-03 17:02:08 +08:00
}
}
2017-10-17 21:22:25 +08:00
}
2017-10-21 19:09:31 +08:00
void e2d::Timer::updateTime()
2017-10-21 19:09:31 +08:00
{
for (auto task : _tasks)
{
task->updateTime();
2017-10-21 19:09:31 +08:00
}
}