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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|