Magic_Game/Easy2D/Msg/MouseMsg.cpp

224 lines
3.4 KiB
C++
Raw Normal View History

2017-09-10 23:56:52 +08:00
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
2017-09-16 23:09:11 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
static std::vector<MouseMsg*> s_vListeners;
2017-09-16 23:09:11 +08:00
2017-09-10 23:56:52 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2017-09-20 14:52:50 +08:00
static MOUSEMSG s_mouseMsg;
2017-09-10 23:56:52 +08:00
2017-09-16 23:09:11 +08:00
void MouseMsg::__exec()
2017-09-10 23:56:52 +08:00
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
while (MouseHit())
{
2017-09-20 14:52:50 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
s_mouseMsg = GetMouseMsg();
2017-09-10 23:56:52 +08:00
// ִ<>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-09-12 12:53:34 +08:00
App::get()->getCurrentScene()->_exec();
2017-09-16 23:09:11 +08:00
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
for (auto l : s_vListeners) // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-09-16 23:09:11 +08:00
{
if (!l->m_bWaiting && l->m_bRunning)
2017-10-06 16:40:10 +08:00
{
l->onMouseMsg(); // ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
2017-09-16 23:09:11 +08:00
}
}
}
MouseMsg::MouseMsg() :
m_callback([]() {}),
2017-10-06 16:40:10 +08:00
m_pParentScene(nullptr),
m_bRunning(true),
m_bWaiting(false)
2017-09-16 23:09:11 +08:00
{
}
MouseMsg::MouseMsg(TString name, const MOUSE_CALLBACK & callback) :
m_sName(name),
m_callback(callback),
2017-10-06 16:40:10 +08:00
m_pParentScene(nullptr),
m_bRunning(true),
m_bWaiting(false)
2017-09-16 23:09:11 +08:00
{
}
MouseMsg::~MouseMsg()
{
}
2017-09-20 14:52:50 +08:00
void MouseMsg::onMouseMsg()
2017-09-16 23:09:11 +08:00
{
2017-09-20 14:52:50 +08:00
m_callback();
2017-09-16 23:09:11 +08:00
}
void MouseMsg::addListener(TString name, const MOUSE_CALLBACK & callback)
2017-09-16 23:09:11 +08:00
{
// <20><><EFBFBD><EFBFBD><EFBFBD>µļ<C2B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
auto listener = new MouseMsg(name, callback);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>
listener->m_pParentScene = App::getLoadingScene();
2017-09-16 23:09:11 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>µİ<C2B5><C4B0><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
s_vListeners.push_back(listener);
2017-09-16 23:09:11 +08:00
}
2017-10-06 16:40:10 +08:00
void MouseMsg::startListener(TString name)
2017-09-16 23:09:11 +08:00
{
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
for (auto l : s_vListeners)
2017-09-16 23:09:11 +08:00
{
if (l->m_sName == name && l->m_pParentScene == App::getCurrentScene())
2017-09-16 23:09:11 +08:00
{
2017-10-06 16:40:10 +08:00
l->start();
2017-09-16 23:09:11 +08:00
}
}
}
2017-10-06 16:40:10 +08:00
void MouseMsg::stopListener(TString name)
{
2017-10-06 16:40:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
for (auto l : s_vListeners)
{
if (l->m_sName == name && l->m_pParentScene == App::getCurrentScene())
{
2017-10-06 16:40:10 +08:00
l->stop();
}
}
}
2017-10-06 16:40:10 +08:00
void MouseMsg::delListener(TString name)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<MouseMsg*>::iterator iter;
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ƶļ<C6B5><C4BC><EFBFBD><EFBFBD><EFBFBD>
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == App::getCurrentScene())
{
// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
delete (*iter);
2017-10-06 16:40:10 +08:00
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
2017-10-06 16:40:10 +08:00
void MouseMsg::start()
{
m_bRunning = true;
}
void MouseMsg::stop()
{
m_bRunning = false;
}
void MouseMsg::wait()
{
m_bWaiting = true;
}
void MouseMsg::notify()
{
m_bWaiting = false;
}
2017-09-20 14:52:50 +08:00
void MouseMsg::clearAllListeners()
2017-09-16 23:09:11 +08:00
{
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
for (auto l : s_vListeners)
2017-09-16 23:09:11 +08:00
{
2017-10-06 16:40:10 +08:00
delete l;
2017-09-10 23:56:52 +08:00
}
2017-09-16 23:09:11 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2017-10-06 16:40:10 +08:00
s_vListeners.clear();
}
void MouseMsg::notifyAllSceneListeners(Scene * scene)
2017-10-06 16:40:10 +08:00
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->notify();
2017-10-06 16:40:10 +08:00
}
}
}
void MouseMsg::waitAllSceneListeners(Scene * scene)
2017-10-06 16:40:10 +08:00
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->wait();
2017-10-06 16:40:10 +08:00
}
}
}
void MouseMsg::clearAllSceneListeners(Scene * scene)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<MouseMsg*>::iterator iter;
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
2017-10-06 16:40:10 +08:00
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ƶļ<C6B5><C4BC><EFBFBD><EFBFBD><EFBFBD>
if ((*iter)->m_pParentScene == scene)
{
// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
delete (*iter);
iter = s_vListeners.erase(iter);
}
else
{
iter++;
2017-10-06 16:40:10 +08:00
}
}
2017-09-10 23:56:52 +08:00
}
2017-09-12 12:53:34 +08:00
bool MouseMsg::isLButtonDown()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.mkLButton;
}
2017-09-12 12:53:34 +08:00
bool MouseMsg::isRButtonDown()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.mkRButton;
}
2017-09-12 12:53:34 +08:00
bool MouseMsg::isMButtonDown()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.mkMButton;
}
2017-09-20 14:52:50 +08:00
int MouseMsg::getX()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.x;
}
2017-09-20 14:52:50 +08:00
int MouseMsg::getY()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.y;
}
2017-09-27 17:56:28 +08:00
CPoint MouseMsg::getPos()
{
return CPoint(s_mouseMsg.x, s_mouseMsg.y);
}
2017-09-20 14:52:50 +08:00
int MouseMsg::getWheel()
2017-09-10 23:56:52 +08:00
{
return s_mouseMsg.wheel;
}
MouseMsg::MESSAGE MouseMsg::getMsg()
2017-09-10 23:56:52 +08:00
{
return MESSAGE(s_mouseMsg.uMsg);
2017-09-10 23:56:52 +08:00
}