2018-04-21 21:24:46 +08:00
|
|
|
|
#include "..\e2dtool.h"
|
2017-10-17 21:22:25 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer * e2d::Timer::_instance = nullptr;
|
2018-04-24 09:02:06 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer * e2d::Timer::getInstance()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!_instance)
|
|
|
|
|
|
_instance = new (std::nothrow) Timer;
|
|
|
|
|
|
return _instance;
|
2018-05-22 23:55:53 +08:00
|
|
|
|
}
|
2018-04-24 09:02:06 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::destroyInstance()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_instance)
|
|
|
|
|
|
{
|
|
|
|
|
|
delete _instance;
|
|
|
|
|
|
_instance = nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-04-24 09:02:06 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer::Timer()
|
|
|
|
|
|
: _tasks()
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-04-21 00:46:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
e2d::Timer::~Timer()
|
2018-04-21 00:46:26 +08:00
|
|
|
|
{
|
2017-10-17 21:22:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::addTask(Task * task)
|
2017-10-17 21:22:25 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
if (task)
|
|
|
|
|
|
{
|
|
|
|
|
|
auto iter = std::find(_tasks.begin(), _tasks.end(), task);
|
|
|
|
|
|
if (iter == _tasks.end())
|
|
|
|
|
|
{
|
2018-07-22 21:22:27 +08:00
|
|
|
|
task->retain();
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->updateTime();
|
|
|
|
|
|
_tasks.push_back(task);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-17 21:22:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::pauseTasks(const String& name)
|
2017-10-17 21:22:25 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
if (task->getName() == name)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->pause();
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-17 21:22:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::resumeTasks(const String& name)
|
2017-10-17 21:22:25 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
if (task->getName() == name)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->resume();
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-17 21:22:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::removeTasks(const String& name)
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
if (task->getName() == name)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->_stopped = true;
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::pauseAllTasks()
|
|
|
|
|
|
{
|
|
|
|
|
|
for (auto task : _tasks)
|
|
|
|
|
|
{
|
|
|
|
|
|
task->pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Timer::resumeAllTasks()
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->resume();
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::removeAllTasks()
|
2017-12-04 11:18:38 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->_stopped = true;
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
2017-12-04 11:18:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::clearAllTasks()
|
2017-10-17 21:22:25 +08:00
|
|
|
|
{
|
2018-07-21 22:57:21 +08:00
|
|
|
|
if (_tasks.empty())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2018-02-07 16:37:12 +08:00
|
|
|
|
{
|
2018-07-22 21:22:27 +08:00
|
|
|
|
task->release();
|
2018-02-07 16:37:12 +08:00
|
|
|
|
}
|
2018-07-05 22:05:23 +08:00
|
|
|
|
_tasks.clear();
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
2017-10-17 21:22:25 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::update()
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +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
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (size_t i = 0; i < _tasks.size();)
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +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-22 21:22:27 +08:00
|
|
|
|
task->release();
|
2018-07-05 22:05:23 +08:00
|
|
|
|
_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>
|
2018-07-05 22:05:23 +08:00
|
|
|
|
if (task->isReady())
|
2018-04-24 09:02:06 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->update();
|
2018-04-24 09:02:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
++i;
|
2018-03-03 17:02:08 +08:00
|
|
|
|
}
|
2017-11-07 22:20:46 +08:00
|
|
|
|
}
|
2017-10-17 21:22:25 +08:00
|
|
|
|
}
|
2017-10-21 19:09:31 +08:00
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
void e2d::Timer::updateTime()
|
2017-10-21 19:09:31 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
for (auto task : _tasks)
|
2017-11-08 15:23:07 +08:00
|
|
|
|
{
|
2018-07-05 22:05:23 +08:00
|
|
|
|
task->updateTime();
|
2017-10-21 19:09:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|