144 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "..\e2dtool.h"
 | |
| 
 | |
| e2d::Timer * e2d::Timer::_instance = nullptr;
 | |
| 
 | |
| e2d::Timer * e2d::Timer::getInstance()
 | |
| {
 | |
| 	if (!_instance)
 | |
| 		_instance = new (std::nothrow) Timer;
 | |
| 	return _instance;
 | |
| }
 | |
| 
 | |
| void e2d::Timer::destroyInstance()
 | |
| {
 | |
| 	if (_instance)
 | |
| 	{
 | |
| 		delete _instance;
 | |
| 		_instance = nullptr;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| e2d::Timer::Timer()
 | |
| 	: _tasks()
 | |
| {
 | |
| }
 | |
| 
 | |
| e2d::Timer::~Timer()
 | |
| {
 | |
| }
 | |
| 
 | |
| void e2d::Timer::addTask(Task * task)
 | |
| {
 | |
| 	if (task)
 | |
| 	{
 | |
| 		auto iter = std::find(_tasks.begin(), _tasks.end(), task);
 | |
| 		if (iter == _tasks.end())
 | |
| 		{
 | |
| 			task->retain();
 | |
| 			task->updateTime();
 | |
| 			_tasks.push_back(task);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::pauseTasks(const String& name)
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		if (task->getName() == name)
 | |
| 		{
 | |
| 			task->pause();
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::resumeTasks(const String& name)
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		if (task->getName() == name)
 | |
| 		{
 | |
| 			task->resume();
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::removeTasks(const String& name)
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		if (task->getName() == name)
 | |
| 		{
 | |
| 			task->_stopped = true;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::pauseAllTasks()
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		task->pause();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::resumeAllTasks()
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		task->resume();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::removeAllTasks()
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		task->_stopped = true;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::clearAllTasks()
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		task->release();
 | |
| 	}
 | |
| 	_tasks.clear();
 | |
| }
 | |
| 
 | |
| void e2d::Timer::update()
 | |
| {
 | |
| 	if (_tasks.empty() || Game::getInstance()->isPaused())
 | |
| 		return;
 | |
| 
 | |
| 	for (size_t i = 0; i < _tasks.size();)
 | |
| 	{
 | |
| 		auto task = _tasks[i];
 | |
| 		// 清除已停止的任务
 | |
| 		if (task->_stopped)
 | |
| 		{
 | |
| 			task->release();
 | |
| 			_tasks.erase(_tasks.begin() + i);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// 更新定时器
 | |
| 			if (task->isReady())
 | |
| 			{
 | |
| 				task->update();
 | |
| 			}
 | |
| 
 | |
| 			++i;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::Timer::updateTime()
 | |
| {
 | |
| 	for (auto task : _tasks)
 | |
| 	{
 | |
| 		task->updateTime();
 | |
| 	}
 | |
| }
 |