133 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "..\e2dmanager.h"
 | |
| #include "..\e2dtool.h"
 | |
| 
 | |
| // 监听器
 | |
| class Listener
 | |
| {
 | |
| public:
 | |
| 	Listener(
 | |
| 		const e2d::Function& func,
 | |
| 		const e2d::String& name,
 | |
| 		bool paused
 | |
| 	)
 | |
| 		: name(name)
 | |
| 		, callback(func)
 | |
| 		, running(!paused)
 | |
| 		, stopped(false)
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	// 更新监听器状态
 | |
| 	virtual void update()
 | |
| 	{
 | |
| 		if (callback)
 | |
| 		{
 | |
| 			callback();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| public:
 | |
| 	bool running;
 | |
| 	bool stopped;
 | |
| 	e2d::String name;
 | |
| 	e2d::Function callback;
 | |
| };
 | |
| 
 | |
| // 监听器容器
 | |
| static std::vector<Listener*> s_vListeners;
 | |
| 
 | |
| 
 | |
| void e2d::InputManager::add(const Function& func, const String& name, bool paused)
 | |
| {
 | |
| 	auto listener = new (std::nothrow) Listener(func, name, paused);
 | |
| 	s_vListeners.push_back(listener);
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::pause(const String& name)
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		if (listener->name == name)
 | |
| 		{
 | |
| 			listener->running = false;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::resume(const String& name)
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		if (listener->name == name)
 | |
| 		{
 | |
| 			listener->running = true;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::stop(const String& name)
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		if (listener->name == name)
 | |
| 		{
 | |
| 			listener->stopped = true;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::pauseAll()
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		listener->running = false;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::resumeAll()
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		listener->running = true;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::stopAll()
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		listener->stopped = true;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::__update()
 | |
| {
 | |
| 	if (s_vListeners.empty() || Game::isPaused())
 | |
| 		return;
 | |
| 
 | |
| 	for (size_t i = 0; i < s_vListeners.size(); ++i)
 | |
| 	{
 | |
| 		auto listener = s_vListeners[i];
 | |
| 		// 清除已停止的监听器
 | |
| 		if (listener->stopped)
 | |
| 		{
 | |
| 			delete listener;
 | |
| 			s_vListeners.erase(s_vListeners.begin() + i);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// 更新监听器
 | |
| 			listener->update();
 | |
| 			++i;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::InputManager::__uninit()
 | |
| {
 | |
| 	for (auto listener : s_vListeners)
 | |
| 	{
 | |
| 		delete listener;
 | |
| 	}
 | |
| 	s_vListeners.clear();
 | |
| } |