208 lines
3.2 KiB
C++
208 lines
3.2 KiB
C++
#include "..\easy2d.h"
|
|
#include "..\EasyX\easyx.h"
|
|
|
|
// 鼠标监听回调函数的容器
|
|
static std::vector<MouseMsg*> s_vListeners;
|
|
|
|
// 鼠标消息
|
|
static MOUSEMSG s_mouseMsg;
|
|
|
|
void MouseMsg::__exec()
|
|
{
|
|
// 获取鼠标消息
|
|
while (MouseHit())
|
|
{
|
|
// 获取鼠标消息
|
|
s_mouseMsg = GetMouseMsg();
|
|
// 执行场景程序
|
|
App::get()->getCurrentScene()->_exec();
|
|
// 执行鼠标监听回调函数
|
|
for (auto l : s_vListeners) // 循环遍历所有的鼠标监听
|
|
{
|
|
if (l->m_bRunning)
|
|
{
|
|
l->onMouseMsg(); // 执行回调函数
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
MouseMsg::MouseMsg() :
|
|
m_callback([]() {}),
|
|
m_pParentScene(nullptr),
|
|
m_bRunning(true)
|
|
{
|
|
}
|
|
|
|
MouseMsg::MouseMsg(TString name, const MOUSE_CALLBACK & callback) :
|
|
m_sName(name),
|
|
m_callback(callback),
|
|
m_pParentScene(nullptr),
|
|
m_bRunning(true)
|
|
{
|
|
}
|
|
|
|
MouseMsg::~MouseMsg()
|
|
{
|
|
}
|
|
|
|
void MouseMsg::onMouseMsg()
|
|
{
|
|
m_callback();
|
|
}
|
|
|
|
void MouseMsg::addListener(TString name, const MOUSE_CALLBACK & callback)
|
|
{
|
|
// 创建新的监听对象
|
|
auto listener = new MouseMsg(name, callback);
|
|
// 绑定在场景上
|
|
listener->m_pParentScene = App::getCurrentScene();
|
|
// 添加新的按键回调函数
|
|
s_vListeners.push_back(listener);
|
|
}
|
|
|
|
void MouseMsg::startListener(TString name)
|
|
{
|
|
// 查找名称相同的监听器
|
|
for (auto l : s_vListeners)
|
|
{
|
|
if (l->m_sName == name && l->m_pParentScene == App::getCurrentScene())
|
|
{
|
|
l->start();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MouseMsg::stopListener(TString name)
|
|
{
|
|
// 查找名称相同的监听器
|
|
for (auto l : s_vListeners)
|
|
{
|
|
if (l->m_sName == name && l->m_pParentScene == App::getCurrentScene())
|
|
{
|
|
l->stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MouseMsg::delListener(TString name)
|
|
{
|
|
// 创建迭代器
|
|
std::vector<MouseMsg*>::iterator iter;
|
|
// 循环遍历所有监听器
|
|
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
|
|
{
|
|
// 查找相同名称的监听器
|
|
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == App::getCurrentScene())
|
|
{
|
|
// 删除该定时器
|
|
delete (*iter);
|
|
iter = s_vListeners.erase(iter);
|
|
}
|
|
else
|
|
{
|
|
iter++;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MouseMsg::start()
|
|
{
|
|
m_bRunning = true;
|
|
}
|
|
|
|
void MouseMsg::stop()
|
|
{
|
|
m_bRunning = false;
|
|
}
|
|
|
|
void MouseMsg::clearAllListeners()
|
|
{
|
|
// 删除所有监听器
|
|
for (auto l : s_vListeners)
|
|
{
|
|
delete l;
|
|
}
|
|
// 清空容器
|
|
s_vListeners.clear();
|
|
}
|
|
|
|
void MouseMsg::startAllSceneListeners(Scene * scene)
|
|
{
|
|
for (auto l : s_vListeners)
|
|
{
|
|
if (l->m_pParentScene == scene)
|
|
{
|
|
l->start();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MouseMsg::stopAllSceneListeners(Scene * scene)
|
|
{
|
|
for (auto l : s_vListeners)
|
|
{
|
|
if (l->m_pParentScene == scene)
|
|
{
|
|
l->stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
void MouseMsg::clearAllSceneListeners(Scene * scene)
|
|
{
|
|
// 创建迭代器
|
|
std::vector<MouseMsg*>::iterator iter;
|
|
// 循环遍历所有监听器
|
|
for (iter = s_vListeners.begin(); iter != s_vListeners.end(); iter++)
|
|
{
|
|
// 查找相同名称的监听器
|
|
if ((*iter)->m_pParentScene == scene)
|
|
{
|
|
// 删除该定时器
|
|
delete (*iter);
|
|
s_vListeners.erase(iter);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool MouseMsg::isLButtonDown()
|
|
{
|
|
return s_mouseMsg.mkLButton;
|
|
}
|
|
|
|
bool MouseMsg::isRButtonDown()
|
|
{
|
|
return s_mouseMsg.mkRButton;
|
|
}
|
|
|
|
bool MouseMsg::isMButtonDown()
|
|
{
|
|
return s_mouseMsg.mkMButton;
|
|
}
|
|
|
|
int MouseMsg::getX()
|
|
{
|
|
return s_mouseMsg.x;
|
|
}
|
|
|
|
int MouseMsg::getY()
|
|
{
|
|
return s_mouseMsg.y;
|
|
}
|
|
|
|
CPoint MouseMsg::getPos()
|
|
{
|
|
return CPoint(s_mouseMsg.x, s_mouseMsg.y);
|
|
}
|
|
|
|
int MouseMsg::getWheel()
|
|
{
|
|
return s_mouseMsg.wheel;
|
|
}
|
|
|
|
MouseMsg::MESSAGE MouseMsg::getMsg()
|
|
{
|
|
return MESSAGE(s_mouseMsg.uMsg);
|
|
}
|