Magic_Game/core/Manager/InputManager.cpp

133 lines
1.9 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 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();
}