Magic_Game/Easy2D/Msg/EMsgManager.cpp

539 lines
10 KiB
C++

#include "..\emsg.h"
#include "..\Win\winbase.h"
#include <vector>
// 鼠标消息
e2d::EMouseMsg mouseMsg;
// 按键消息
e2d::EKeyMsg keyMsg;
// 鼠标消息监听器
std::vector<e2d::EMouseListener*> s_vMouseListeners;
// 按键消息监听器
std::vector<e2d::EKeyboardListener*> s_vKeyboardListeners;
DWORD e2d::EMouseMsg::getX()
{
return LOWORD(mouseMsg.m_lParam);
}
DWORD e2d::EMouseMsg::getY()
{
return HIWORD(mouseMsg.m_lParam);
}
e2d::EPoint e2d::EMouseMsg::getPos()
{
return EPoint(LOWORD(mouseMsg.m_lParam), HIWORD(mouseMsg.m_lParam));
}
bool e2d::EMouseMsg::isLButtonDown()
{
return GET_KEYSTATE_WPARAM(mouseMsg.m_wParam) == MK_LBUTTON;
}
bool e2d::EMouseMsg::isMButtonDown()
{
return GET_KEYSTATE_WPARAM(mouseMsg.m_wParam) == MK_MBUTTON;
}
bool e2d::EMouseMsg::isRButtonDown()
{
return GET_KEYSTATE_WPARAM(mouseMsg.m_wParam) == MK_RBUTTON;
}
bool e2d::EMouseMsg::isShiftDown()
{
return GET_KEYSTATE_WPARAM(mouseMsg.m_wParam) == MK_SHIFT;
}
bool e2d::EMouseMsg::isCtrlDown()
{
return GET_KEYSTATE_WPARAM(mouseMsg.m_wParam) == MK_CONTROL;
}
DWORD e2d::EMouseMsg::getWheelDelta()
{
return GET_WHEEL_DELTA_WPARAM(mouseMsg.m_wParam);
}
e2d::EMouseMsg::MOUSE_MSG e2d::EMouseMsg::getMsg()
{
return MOUSE_MSG(mouseMsg.m_nMsg);
}
e2d::EKeyMsg::KEYBOARD_MSG e2d::EKeyMsg::getMsg()
{
return KEYBOARD_MSG(keyMsg.m_nMsg);
}
e2d::EKeyMsg::KEY e2d::EKeyMsg::getVal()
{
return KEY(keyMsg.m_wParam);
}
DWORD e2d::EKeyMsg::getCount()
{
return (((DWORD)keyMsg.m_lParam) & 0x0000FFFF);
}
bool e2d::EKeyMsg::isKeyDown(KEY key)
{
if (::GetAsyncKeyState((int)key) & 0x8000)
{
return true;
}
return false;
}
bool e2d::EKeyMsg::isCapitalLockOn()
{
if (::GetKeyState(VK_CAPITAL) & 0x0001)
{
return true;
}
return false;
}
bool e2d::EKeyMsg::isNumpadLockOn()
{
if (::GetKeyState(VK_NUMLOCK) & 0x0001)
{
return true;
}
return false;
}
bool e2d::EKeyMsg::isScrollLockOn()
{
if (::GetKeyState(VK_SCROLL) & 0x0001)
{
return true;
}
return false;
}
void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// 保存鼠标消息
mouseMsg.m_nMsg = message;
mouseMsg.m_wParam = wParam;
mouseMsg.m_lParam = lParam;
// 执行鼠标消息监听函数
for (auto mlistener : s_vMouseListeners)
{
if (mlistener->isRunning())
{
mlistener->runCallback();
}
}
}
void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// 保存按键消息
keyMsg.m_nMsg = message;
keyMsg.m_wParam = wParam;
keyMsg.m_lParam = lParam;
// 执行按键消息监听函数
for (auto klistener : s_vKeyboardListeners)
{
if (klistener->isRunning())
{
klistener->runCallback();
}
}
}
void e2d::EMsgManager::bindListenerWith(e2d::EMouseListener * listener, EScene * pParentScene)
{
WARN_IF(listener == nullptr, "EMouseListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EMouseListener with a NULL EScene pointer!");
if (listener && pParentScene)
{
listener->start();
listener->retain();
listener->m_pParentScene = pParentScene;
s_vMouseListeners.push_back(listener);
}
}
void e2d::EMsgManager::bindListenerWith(EKeyboardListener * listener, EScene * pParentScene)
{
WARN_IF(listener == nullptr, "EKeyboardListener NULL pointer exception!");
WARN_IF(pParentScene == nullptr, "Bind EKeyboardListener with a NULL EScene pointer!");
if (listener && pParentScene)
{
listener->start();
listener->retain();
listener->m_pParentScene = pParentScene;
s_vKeyboardListeners.push_back(listener);
}
}
void e2d::EMsgManager::bindListenerWith(EMouseListener * listener, ENode * pParentNode)
{
WARN_IF(listener == nullptr, "EMouseListener NULL pointer exception!");
WARN_IF(pParentNode == nullptr, "Bind EMouseListener with a NULL ENode pointer!");
if (listener && pParentNode)
{
listener->start();
listener->retain();
listener->m_pParentNode = pParentNode;
s_vMouseListeners.push_back(listener);
}
}
void e2d::EMsgManager::bindListenerWith(EKeyboardListener * listener, ENode * pParentNode)
{
WARN_IF(listener == nullptr, "EKeyboardListener NULL pointer exception!");
WARN_IF(pParentNode == nullptr, "Bind EKeyboardListener with a NULL ENode pointer!");
if (listener && pParentNode)
{
listener->start();
listener->retain();
listener->m_pParentNode = pParentNode;
s_vKeyboardListeners.push_back(listener);
}
}
void e2d::EMsgManager::startListener(EString name)
{
// 启动鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getName() == name)
{
l->start();
}
}
// 启动按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getName() == name)
{
l->start();
}
}
}
void e2d::EMsgManager::stopListener(EString name)
{
// 停止鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getName() == name)
{
l->stop();
}
}
// 停止按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getName() == name)
{
l->stop();
}
}
}
void e2d::EMsgManager::delListener(EString name)
{
// 删除鼠标消息监听器
std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{
if ((*mIter)->getName() == name)
{
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
else
{
mIter++;
}
}
// 删除按键消息监听器
std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyboardListeners.begin(); kIter != s_vKeyboardListeners.end();)
{
if ((*kIter)->getName() == name)
{
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyboardListeners.erase(kIter);
}
else
{
kIter++;
}
}
}
void e2d::EMsgManager::startAllMouseListener()
{
for (auto l : s_vMouseListeners)
{
if (!l->isWaiting())
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllMouseListener()
{
for (auto l : s_vMouseListeners)
{
if (!l->isWaiting())
{
l->stop();
}
}
}
void e2d::EMsgManager::clearAllMouseListeners()
{
for (auto l : s_vMouseListeners)
{
l->autoRelease();
l->release();
}
s_vMouseListeners.clear();
}
void e2d::EMsgManager::startAllKeyboardListener()
{
for (auto l : s_vKeyboardListeners)
{
if (!l->isWaiting())
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllKeyboardListener()
{
for (auto l : s_vKeyboardListeners)
{
if (!l->isWaiting())
{
l->stop();
}
}
}
void e2d::EMsgManager::clearAllKeyboardListeners()
{
for (auto l : s_vKeyboardListeners)
{
l->autoRelease();
l->release();
}
s_vKeyboardListeners.clear();
}
void e2d::EMsgManager::startAllMouseListenersBindWithScene(EScene * pParentScene)
{
// 启动鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == pParentScene)
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllMouseListenersBindWithScene(EScene * pParentScene)
{
// 停止鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == pParentScene)
{
l->stop();
}
}
}
void e2d::EMsgManager::startAllKeyboardListenersBindWithScene(EScene * pParentScene)
{
// 启动按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentScene() == pParentScene)
{
l->start();
}
}
}
void e2d::EMsgManager::stopAllKeyboardListenersBindWithScene(EScene * pParentScene)
{
// 停止按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentScene() == pParentScene)
{
l->stop();
}
}
}
void e2d::EMsgManager::waitAllListenersBindWithScene(EScene * scene)
{
// 挂起鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == scene)
{
l->wait();
}
}
// 挂起按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentScene() == scene)
{
l->wait();
}
}
}
void e2d::EMsgManager::notifyAllListenersBindWithScene(EScene * scene)
{
// 重启鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentScene() == scene)
{
l->notify();
}
}
// 重启按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentScene() == scene)
{
l->notify();
}
}
}
void e2d::EMsgManager::clearAllListenersBindWithScene(EScene * scene)
{
std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{
if ((*mIter)->getParentScene() == scene)
{
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
else
{
mIter++;
}
}
std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyboardListeners.begin(); kIter != s_vKeyboardListeners.end();)
{
if ((*kIter)->getParentScene() == scene)
{
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyboardListeners.erase(kIter);
}
else
{
kIter++;
}
}
}
void e2d::EMsgManager::waitAllListenersBindWithNode(ENode * pParentNode)
{
// 挂起鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentNode() == pParentNode)
{
l->wait();
}
}
// 挂起按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentNode() == pParentNode)
{
l->wait();
}
}
}
void e2d::EMsgManager::notifyAllListenersBindWithNode(ENode * pParentNode)
{
// 重启鼠标消息监听器
for (auto l : s_vMouseListeners)
{
if (l->getParentNode() == pParentNode)
{
l->notify();
}
}
// 重启按键消息监听器
for (auto l : s_vKeyboardListeners)
{
if (l->getParentNode() == pParentNode)
{
l->notify();
}
}
}
void e2d::EMsgManager::clearAllListenersBindWithNode(ENode * pParentNode)
{
std::vector<EMouseListener*>::iterator mIter;
for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();)
{
if ((*mIter)->getParentNode() == pParentNode)
{
(*mIter)->autoRelease();
(*mIter)->release();
mIter = s_vMouseListeners.erase(mIter);
}
else
{
mIter++;
}
}
std::vector<EKeyboardListener*>::iterator kIter;
for (kIter = s_vKeyboardListeners.begin(); kIter != s_vKeyboardListeners.end();)
{
if ((*kIter)->getParentNode() == pParentNode)
{
(*kIter)->autoRelease();
(*kIter)->release();
kIter = s_vKeyboardListeners.erase(kIter);
}
else
{
kIter++;
}
}
}