163 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "..\e2dbase.h"
 | ||
| #include "..\e2dmanager.h"
 | ||
| #include "..\e2dtool.h"
 | ||
| 
 | ||
| 
 | ||
| e2d::InputManager * e2d::InputManager::_instance = nullptr;
 | ||
| 
 | ||
| e2d::InputManager * e2d::InputManager::getInstance()
 | ||
| {
 | ||
| 	if (!_instance)
 | ||
| 		_instance = new (std::nothrow) InputManager;
 | ||
| 	return _instance;
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::destroyInstance()
 | ||
| {
 | ||
| 	if (_instance)
 | ||
| 	{
 | ||
| 		delete _instance;
 | ||
| 		_instance = nullptr;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| e2d::InputManager::InputManager()
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| e2d::InputManager::~InputManager()
 | ||
| {
 | ||
| }
 | ||
| 
 | ||
| e2d::Listener * e2d::InputManager::addListener(const Function& func, const String& name, bool paused)
 | ||
| {
 | ||
| 	auto listener = new (e2d::autorelease) Listener(func, name, paused);
 | ||
| 	GC::retain(listener);
 | ||
| 	_listeners.push_back(listener);
 | ||
| 	return listener;
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::addListener(Listener * listener)
 | ||
| {
 | ||
| 	if (listener)
 | ||
| 	{
 | ||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
 | ||
| 		if (iter == _listeners.end())
 | ||
| 		{
 | ||
| 			GC::retain(listener);
 | ||
| 			_listeners.push_back(listener);
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::removeListener(Listener * listener)
 | ||
| {
 | ||
| 	if (listener)
 | ||
| 	{
 | ||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener);
 | ||
| 		if (iter != _listeners.end())
 | ||
| 		{
 | ||
| 			GC::safeRelease(listener);
 | ||
| 			_listeners.erase(iter);
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::stopListener(const String& name)
 | ||
| {
 | ||
| 	if (_listeners.empty() || name.isEmpty())
 | ||
| 		return;
 | ||
| 
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		if (listener->_name == name)
 | ||
| 		{
 | ||
| 			listener->stop();
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::startListener(const String& name)
 | ||
| {
 | ||
| 	if (_listeners.empty() || name.isEmpty())
 | ||
| 		return;
 | ||
| 
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		if (listener->_name == name)
 | ||
| 		{
 | ||
| 			listener->start();
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::removeListener(const String& name)
 | ||
| {
 | ||
| 	if (_listeners.empty() || name.isEmpty())
 | ||
| 		return;
 | ||
| 
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		if (listener->_name == name)
 | ||
| 		{
 | ||
| 			listener->_stopped = true;
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::stopAllListeners()
 | ||
| {
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		listener->stop();
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::startAllListeners()
 | ||
| {
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		listener->start();
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::removeAllListeners()
 | ||
| {
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		listener->_stopped = true;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::clearAllListeners()
 | ||
| {
 | ||
| 	for (auto listener : _listeners)
 | ||
| 	{
 | ||
| 		GC::release(listener);
 | ||
| 	}
 | ||
| 	_listeners.clear();
 | ||
| }
 | ||
| 
 | ||
| void e2d::InputManager::update()
 | ||
| {
 | ||
| 	if (_listeners.empty() || Game::getInstance()->isPaused())
 | ||
| 		return;
 | ||
| 
 | ||
| 	for (size_t i = 0; i < _listeners.size(); ++i)
 | ||
| 	{
 | ||
| 		auto listener = _listeners[i];
 | ||
| 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 		if (listener->_stopped)
 | ||
| 		{
 | ||
| 			GC::safeRelease(listener);
 | ||
| 			_listeners.erase(_listeners.begin() + i);
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
 | ||
| 			listener->_update();
 | ||
| 			++i;
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 |